루트가 init 프로세스를 죽일 수 있습니까?


38

루트가 init 프로세스 (pid 1 프로세스)를 종료시킬 수 있습니까? 그 결과는 무엇입니까?

답변:


38

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

프로세스 ID 1, init 프로세스로 보낼 수있는 유일한 신호는 init가 명시 적으로 신호 처리기를 설치 한 신호입니다. 이것은 실수로 시스템이 다운되지 않도록하기 위해 수행됩니다.

Pid 1 (init)은 자신을 강제 종료 할 수 있습니다.이 경우 "kill"은 기본적으로 자체 종료 요청입니다. halt명령 을 구현하는 방법 중 하나는 가능 하지만 명령 을 구현하는 방법은 없습니다 init.

Mac에서 launchd신호 15 (SIGTERM)를 사용하여 종료 (초기 아날로그)하면 시스템을 즉시 재부팅하여 실행중인 프로그램을 완전히 종료하지 않아도됩니다. 잡을 수없는 신호 9 (SIGKILL)로 그것을 죽이는 것은 Mac의 kill()의미 가이 점에서 Linux의 의미와 동일 하다는 것을 보여줍니다 .

현재 실험 할 Linux 상자가 없기 때문에 initSIGTERM으로 Linux가 무엇을하는지에 대한 질문은 기다려야합니다. 그리고 함께 init갑자기 출세와 Systemd 요즘 인기있는 것 같아 교체 프로젝트, 대답은 변수가 될 수있다.

업데이트 : Linux에서는 initSIGTERM을 명시 적으로 무시하므로 아무 것도 수행하지 않습니다. @jsbillings에는 Upstart 및 Systemd의 기능에 대한 정보가 있습니다.


1
당신이 이미 그것을 찾은 것처럼 보이지만 후손을 위해 : unix.stackexchange.com/questions/85364
Jander

1
당신은 죽일 수 init로모그래퍼 Segmentation fault( SIGSEGV: 커널 패닉 발생합니다) 신호kill -SEGV 1
존슨 청지기

13

SysV 초기화는 SIGKILL 또는 SIGTERM 신호를 무시합니다. 상태를 변경하는 유일한 신호는 SIGPWR이며 전원 관련 종료 일정을 알려줍니다.

Upstart 및 Systemd도 SIGKILL에 응답하지 않는 것으로 보이며 내 테스트에서 SIGTERM이 가동을 시작하고 시스템을 다시 실행하는 것으로 보입니다.

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


6

기술적으로 예, root는 SIGKILL을 발행하여 초기화 할 수 있습니다. 그러나 init는 신호를 포착하고 무시할 수 있다는 점에서 대부분의 거의 모든 다른 프로세스와 다릅니다.

당신은 느슨하게, a kill -TERM 1를 발행하는 것과 비슷한 a 를 발행함으로써 init를 죽일 수 있습니다 . halt또는 shutdowninit는 그 신호 자체를 존중하기 전에 모든 아이들, 본질적으로 다른 모든 프로세스에 신호를 전달합니다.

참고 :이 명령 수행하면 시스템 종료됩니다.

풍미를 위해; SIGKILL을 "무시"할 수있는 한 가지 유형의 프로세스는 i / o를 기다리는 프로세스와 같이 인터럽트 불가능한 휴면 상태입니다. ps axo stat,comm상태가 'D'인 프로세스를 인터럽트 할 수없는 위치 를 발행하여 이러한 프로세스를 찾을 수 있습니다 .


2
실제로, 내 테스트에서, kill -TERM 1대부분의 리눅스 시스템에서 init 자체를 다시 실행시키는 것 외에는 아무것도하지 않을 것이며, 시스템을 종료시키기 위해 할 수있는 유일한 방법은kill -PWR 1
jsbillings

@jsbillings 임베디드 Linux SBC에서 발행 작업을 수행 kill -TERM 1하면 재부팅이 발생합니다 (실제로 ::shutdown:inittab 의 항목 및 관련 스크립트를 통해 진행됨 )
SF.

init가 D 상태 인 경우 시스템이 실제로 아 sick니다.
Joshua

6

init프로세스 를 다시 시작할 수 있습니다 . inittab재부팅하지 않고 변경하는 데 유용합니다 .

kill -HUP 1

출처 : http://www.cyberciti.biz/faq/linux-unix-kill-hup-1-reread-etcinittab-file/


1
구현 init에서이 신호는 프로세스를 다시 시작하지 않고 /etc/inittab파일 을 다시로드한다는 것을 알고 있습니다. --- 반대로 ( 리눅스에서 대체) systemctl daemon-reexec실제로 다시 실행합니다. systemdinit
pabouk

4

sudo kill -INT 1(인터럽트)는 시스템을 재시작하고 sudo kill -SEGV 1, (세그멘테이션 위반) 또는 sudo kill -ABRT 1(중단)은 커널 패닉을 생성합니다.

참고 : sudo가 필요합니다.


2

글쎄, 루트는 리눅스에서 init 프로세스를 죽일 수 있습니다 :

strace -p 1 -o OUT &
kill -9 1

세부:

kill -9 1 작동하지 않습니다 :

-bash-4.3# trace-cmd start -e signal_deliver -f 'common_pid == 1' -e signal_generate -f 'pid == 1'

-bash-4.3# echo "My first attempt" >/sys/kernel/debug/tracing/trace_marker
-bash-4.3# kill -9 1

-bash-4.3# trace-cmd show # there is no signal_deliver-event
...
        bash-164   [000] .N..    29.302996: tracing_mark_write: My first attempt
        bash-164   [000] d...    29.312586: signal_generate: sig=9 errno=0 code=0 comm=systemd pid=1 grp=1 res=1

그럼 실행 해 봅시다 strace:

-bash-4.3# echo 1 >/proc/sys/kernel/ftrace_dump_on_oops
-bash-4.3# strace -p 1 -o OUT &
[1] 179
strace: Process 1 attached
-bash-4.3# echo "My second attempt" >/sys/kernel/debug/tracing/trace_marker
-bash-4.3# kill -9 1

bash-4.3# [  134.943439] Kernel panic - not syncing: Attempted to kill init! exitcode=0x00000009
[  134.943439]
[  134.943439] CPU: 0 PID: 1 Comm: systemd Not tainted 4.7.2-201.fc24.x86_64 #1
[  134.943439] Hardware name: QEMU Standard PC (i440FX + PIIX, 1996), BIOS 1.9.1-1.fc24 04/01/2014
[  134.943439]  0000000000000086 00000000610ec632 ffff88001ea43c10 ffffffff813d941f
[  134.943439]  ffffffff81a290c0 ffff88001ea43ca8 ffff88001ea43c98 ffffffff811b2cb6
[  134.943439]  ffffffff00000010 ffff88001ea43ca8 ffff88001ea43c40 00000000610ec632
[  134.943439] Call Trace:
[  134.943439]  [<ffffffff813d941f>] dump_stack+0x63/0x84
[  134.943439]  [<ffffffff811b2cb6>] panic+0xde/0x22a
[  134.943439]  [<ffffffff810a40ac>] do_exit+0xb6c/0xb70
[  134.943439]  [<ffffffff810a4137>] do_group_exit+0x47/0xb0
[  134.943439]  [<ffffffff810af3ed>] get_signal+0x28d/0x630
[  134.943439]  [<ffffffff81025f57>] do_signal+0x37/0x6c0
[  134.943439]  [<ffffffff8100325b>] ? do_audit_syscall_entry+0x4b/0x70
[  134.943439]  [<ffffffff810ca250>] ? wake_up_q+0x70/0x70
[  134.943439]  [<ffffffff8100330c>] exit_to_usermode_loop+0x8c/0xd0
[  134.943439]  [<ffffffff81003df3>] do_syscall_64+0x103/0x110
[  134.943439]  [<ffffffff817eb921>] entry_SYSCALL64_slow_path+0x25/0x25
[  134.943439] Dumping ftrace buffer:
[  134.943439] ---------------------------------
[  134.943439]     bash-154     0.... 10592888us : tracing_mark_write: My first attempt
[  134.943439]     bash-154     0d... 17328079us : signal_generate: sig=9 errno=0 code=0 comm=systemd pid=1 grp=1 res=1
[  134.943439]     bash-154     0.... 80772500us : tracing_mark_write: My second attempt
[  134.943439]     bash-154     0dN.. 85426791us : signal_generate: sig=9 errno=0 code=0 comm=systemd pid=1 grp=1 res=0
[  134.943439]  systemd-1       0d... 85437478us : signal_deliver: sig=9 errno=0 code=0 sa_handler=0 sa_flags=0
[  134.943439] ---------------------------------
[  134.943439] Kernel Offset: disabled
[  134.943439] ---[ end Kernel panic - not syncing: Attempted to kill     init! exitcode=0x00000009
[  134.943439]

커널이 전달되지 않은 것 같습니다 SIGKILLPID1있기 때문에 github.com/torvalds/linux/commit/...가 합병되었다.
Evgeny Vereshchagin

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.