可以用root杀死init进程吗?


38

可以用root杀死init进程(pid 1的进程)吗?其后果是什么?

Answers:


38

默认情况下,不,这是不允许的。在Linux下(来自man 2 kill):

可以发送到进程ID 1(初始化进程)的唯一信号是那些已为init明确安装了信号处理程序的信号。这样做是为了确保不会意外关闭系统。

标识1(init)可以决定允许自己被杀死,在这种情况下,“ kill”基本上是要求其关闭自身的请求。这是实现halt命令的一种可能方法,尽管我不知道有什么方法可以执行该命令init

在Mac上,launchd使用信号15(SIGTERM)杀死(其初始模拟信号)将立即重新启动系统,而无需费心地关闭正在运行的程序。用不可捕获的信号9(SIGKILL)杀死它无济于事,这表明Mac kill()在这方面的语义与Linux相同。

目前,我没有一个愿意尝试的Linux专用盒,因此,Linux如何init处理SIGTERM的问题将不得不等待。init如今, 随着Upstart和Systemd之类的替代项目越来越受欢迎,答案可能是可变的。

更新:在Linux上,init显式忽略SIGTERM,因此它什么也不做。@jsbillings包含有关Upstart和Systemd的信息。


1
看起来您已经找到它了,但是后代:unix.stackexchange.com/questions/85364
Jander

1
您可以init使用Segmentation faultSIGSEGV)信号杀死,这将导致内核恐慌:kill -SEGV 1
Johnson Steward

13

SysV初始化忽略SIGKILL或SIGTERM信号。据我所知,导致状态改变的唯一信号是SIGPWR,它会调度与电源有关的停机。

看来Upstart和Systemd也没有响应SIGKILL,从我的测试来看,似乎是SIGTERM导致Upstart和systemd重新执行。

我不确定其他应答程序正在运行什么,但是我很确定您不能杀死-9(SIGKILL)或杀死-15(SIGTERM)init(pid 1)。如果可能的话,很可能会出现内核恐慌,因为init意外退出并带有非零退出代码,这不理想。它不会关闭计算机,也不会导致计算机重启。


6

从技术上讲,是的,root可以发出SIGKILL进行初始化。但是,init实际上与大多数几乎所有其他进程都不同,它允许捕获和忽略信号。

您可以松散地通过发出a kill -TERM 1来终止init,这类似于发出a haltshutdowninit,它将在尊重信号本身之前将信号传递给所有子进程,基本上是所有其他进程。

请注意:执行此命令关闭系统。

为了风味;可以“忽略” SIGKILL的另一种其他进程是处于不间断睡眠的进程,例如等待I / O的进程。可以通过发出ps axo stat,comm状态为“ D”的进程不间断的位置来找到这样的进程。


2
实际上,从我的测试来看,kill -TERM 1除了使init在大多数linux系统上重新执行之外,什么都不会做,而导致系统关闭系统的唯一措施就是运行kill -PWR 1
jsbillings

@jsbillings在我正在发行的嵌入式Linux SBC上,kill -TERM 1肯定会导致重新引导(实际上是通过::shutdown:inittab中的条目和相关脚本进行的。)
SF。

如果init长时间处于D状态,则您的系统真的很病。
约书亚


4

sudo kill -INT 1(中断)将重新启动系统,而 sudo kill -SEGV 1,(违反分段)或sudo kill -ABRT 1(中止)将产生内核崩溃。

注意:sudo是必需的。


2

好吧,root可以杀死Linux上的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]

看来,内核尚未交付SIGKILLPID1github.com/torvalds/linux/commit/...被合并。
Evgeny Vereshchagin

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.