init 프로세스를 루트로 죽일 수 있나요?

init 프로세스를 루트로 죽일 수 있나요?

init 프로세스(pid 1을 사용하는 프로세스)를 루트로 종료할 수 있습니까? 그 결과는 무엇입니까?

답변1

기본적으로 아니요. 이는 허용되지 않습니다. Linux에서(man 2 kill):

프로세스 ID 1(즉, init 프로세스)로 보낼 수 있는 유일한 신호는 init에 명시적인 신호 처리기가 설치된 신호입니다. 이는 시스템이 예기치 않게 충돌하지 않도록 하기 위해 수행됩니다.

Pid 1(init)은 자신이 종료되도록 결정할 수 있으며, 이 경우 "killing"은 기본적으로 자체 종료를 요청하는 것입니다. 이것은 이 명령을 구현하는 한 가지 가능한 방법이지만, 이를 수행할 수 있는 방법 halt은 모르겠습니다 .init

Mac에서 launchd신호 15(SIGTERM)(초기화 아날로그)로 종료하면 실행 중인 프로그램을 완전히 종료하지 않고 시스템을 즉시 다시 시작합니다. 포착할 수 없는 신호 9(SIGKILL)로 종료하면 아무 일도 일어나지 않습니다. 이는 Mac의 kill()의미 체계가 이 점에서 Linux의 의미와 동일함을 나타냅니다.

현재, 시도해 볼 의향이 있는 Linux 상자가 없습니다. 따라서 initLinux가 SIGTERM을 사용하여 수행하는 작업에 대한 질문은 기다려야 합니다. 오늘날 Upstart 및 Systemd와 같은 대체 프로젝트가 더욱 대중화됨에 따라 init대답은 달라질 수 있습니다.

고쳐 쓰다: Linux에서는 initSIGTERM이 명시적으로 무시되므로 아무 작업도 수행하지 않습니다. @jsbillings에 정보가 있습니다Upstart와 Systemd가 하는 일.

답변2

SysV init는 SIGKILL 또는 SIGTERM 신호를 무시합니다. 내가 아는 한, 상태 변경을 일으키는 유일한 신호는 전원 관련 종료를 예약하는 SIGPWR입니다.

Upstart 및 Systemd도 SIGKILL에 응답하지 않는 것으로 보이며, 제가 테스트한 결과 SIGTERM으로 인해 upstart 및 systemd가 다시 실행되는 것으로 보입니다.

다른 응답자가 무엇을 실행하고 있는지 잘 모르겠지만 kill -9(SIGKILL) 또는 kill -15(SIGTERM) init(pid 1)을 수행할 수는 없다고 확신합니다. 가능하다면 init가 0이 아닌 종료 코드로 예기치 않게 종료되었기 때문에 커널 패닉이 발생할 가능성이 높습니다. 이는 이상적이지 않습니다. 컴퓨터가 종료되거나 다시 시작되지는 않습니다.

답변3

기술적으로는 그렇습니다. 루트는 초기화를 위해 SIGKILL을 발행할 수 있습니다. 그러나 init는 신호를 포착하고 무시할 수 있다는 점에서 대부분의(실제로는 거의 모든) 다른 프로세스와 다릅니다.

a를 실행하여 init를 느슨하게 종료할 수 있습니다. 이는 신호 자체를 존중하기 전에 모든 하위 프로세스(기본적으로 다른 모든 프로세스)에 신호를 전달하는 a 또는 init를 kill -TERM 1실행하는 것과 유사합니다 .haltshutdown

참고: 이 명령을 실행하세요.~ 할 것이다시스템을 종료합니다.

SIGKILL을 "무시"할 수 있는 또 다른 유형의 프로세스는 I/O를 기다리는 프로세스와 같이 중단 없는 절전 상태에 있는 프로세스입니다. 이러한 프로세스는 ps axo stat,comm상태가 "D"인 프로세스를 중단할 수 없는 명령을 실행하여 찾을 수 있습니다 .

답변4

sudo kill -INT 1(중단)은 시스템을 재부팅하고 sudo kill -SEGV 1, (세그먼트 위반) 또는 sudo kill -ABRT 1(중단)은 커널 패닉을 생성합니다.

참고: sudo가 필요합니다.

관련 정보