root可以杀死init进程吗?

root可以杀死init进程吗?

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 机器,因此 Linuxinit对 SIGTERM 有何作用的问题必须等待。 随着initUpstart 和 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,这类似于发出 ahaltshutdowninit 会在尊重信号本身之前将信号传递给所有子进程,本质上是所有其他进程。

请注意:执行此命令将要关闭你的系统。

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

答案4

sudo kill -INT 1(中断)将重新启动系统,并且 sudo kill -SEGV 1,(分段冲突)或sudo kill -ABRT 1(中止)将生成内核恐慌。

注意:需要 sudo。

相关内容