Answers:
默认情况下,不,这是不允许的。在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的信息。
init
使用Segmentation fault
(SIGSEGV
)信号杀死,这将导致内核恐慌:kill -SEGV 1
SysV初始化忽略SIGKILL或SIGTERM信号。据我所知,导致状态改变的唯一信号是SIGPWR,它会调度与电源有关的停机。
看来Upstart和Systemd也没有响应SIGKILL,从我的测试来看,似乎是SIGTERM导致Upstart和systemd重新执行。
我不确定其他应答程序正在运行什么,但是我很确定您不能杀死-9(SIGKILL)或杀死-15(SIGTERM)init(pid 1)。如果可能的话,很可能会出现内核恐慌,因为init意外退出并带有非零退出代码,这不理想。它不会关闭计算机,也不会导致计算机重启。
从技术上讲,是的,root可以发出SIGKILL进行初始化。但是,init实际上与大多数几乎所有其他进程都不同,它允许捕获和忽略信号。
您可以松散地通过发出a kill -TERM 1
来终止init,这类似于发出a halt
或shutdown
init,它将在尊重信号本身之前将信号传递给所有子进程,基本上是所有其他进程。
请注意:执行此命令将关闭系统。
为了风味;可以“忽略” SIGKILL的另一种其他进程是处于不间断睡眠的进程,例如等待I / O的进程。可以通过发出ps axo stat,comm
状态为“ D”的进程不间断的位置来找到这样的进程。
kill -TERM 1
除了使init在大多数linux系统上重新执行之外,什么都不会做,而导致系统关闭系统的唯一措施就是运行kill -PWR 1
kill -TERM 1
肯定会导致重新引导(实际上是通过::shutdown:
inittab中的条目和相关脚本进行的。)
您可以重新启动该init
过程。这对于inittab
无需重新启动即可进行更改非常有用。
kill -HUP 1
资料来源:http : //www.cyberciti.biz/faq/linux-unix-kill-hup-1-reread-etcinittab-file/
init
我的实现中,我知道此信号不会使进程重新启动,而只是重新加载/etc/inittab
文件。---相反,systemctl daemon-reexec
确实可以systemd
(init
在Linux上替代)重新执行。
好吧,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]
输入sudo kill -INT 1
,然后查看会发生什么。