root可以杀死init进程(pid为1的进程)吗?其后果是什么?
答案1
默认情况下,不,这是不允许的。在 Linux 下(来自man 2 kill
):
唯一可以发送到进程 ID 1(即 init 进程)的信号是 init 已显式安装信号处理程序的信号。这样做是为了确保系统不会意外崩溃。
Pid 1 (init) 可以决定允许自己被杀死,在这种情况下,“杀死”基本上是要求它关闭自己。这是实现该halt
命令的一种可能的方法,尽管我不知道有任何init
方法可以做到这一点。
在 Mac 上,launchd
使用信号 15 (SIGTERM) 杀死(其 init 类似物)将立即重新启动系统,而无需彻底关闭正在运行的程序。使用无法捕获的信号 9 (SIGKILL) 杀死它不会执行任何操作,这表明 Mac 的kill()
语义在这方面与 Linux 的语义相同。
目前,我手边没有愿意尝试的 Linux 机器,因此 Linux 随着init
对 SIGTERM 有何作用的问题必须等待。init
Upstart 和 Systemd 等替代项目如今越来越流行,答案可能会有所不同。
更新:在 Linux 上,init
显式忽略 SIGTERM,因此它不执行任何操作。 @jsbillings 有信息Upstart 和 Systemd 做什么。
答案2
SysV init 忽略 SIGKILL 或 SIGTERM 信号。据我所知,导致状态改变的唯一信号是 SIGPWR,它安排与电源相关的关闭。
看来 Upstart 和 Systemd 也没有响应 SIGKILL,并且从我的测试来看,SIGTERM 似乎会导致 upstart 和 systemd 重新执行。
我不确定其他回答者正在运行什么,但我很确定你不能杀死 -9 (SIGKILL) 或杀死 -15 (SIGTERM) init (pid 1)。如果可以的话,您很可能会遇到内核恐慌,因为 init 意外地以非零退出代码退出,这不太理想。它不会关闭您的计算机,也不会导致计算机重新启动。
答案3
从技术上讲,是的,root 可以发出 SIGKILL 来初始化。然而,init 与大多数(实际上几乎所有)其他进程不同,因为它允许捕获和忽略信号。
您可以松散地通过发出 a 来杀死 init kill -TERM 1
,这类似于发出 ahalt
或shutdown
init 会在尊重信号本身之前将信号传递给所有子进程,本质上是所有其他进程。
请注意:执行此命令将要关闭你的系统。
为了风味;一种可以“忽略”SIGKILL 的其他进程是处于不间断睡眠状态的进程,例如等待 I/O 的进程。这样的进程可以通过发出一个命令来找到,ps axo stat,comm
其中状态为“D”的进程是不可中断的。
答案4
sudo kill -INT 1
(中断)将重新启动系统,并且
sudo kill -SEGV 1
,(分段冲突)或sudo kill -ABRT 1
(中止)将生成内核恐慌。
注意:需要 sudo。