root 可以杀死 init 进程吗?

Dha*_*mit 44 root init

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

Jan*_*der 44

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

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

Pid 1 (init) 可以决定允许自己被杀死,在这种情况下,“杀死”基本上是请求它关闭自己。这是实现该halt命令的一种可能方法,尽管我不知道有任何方法可以init这样做。

在 Mac 上,launchd使用信号 15 (SIGTERM)杀死(其 init 模拟)将立即重新启动系统,而无需费心关闭正在运行的程序。用 uncatchable signal 9 (SIGKILL) 杀死它没有任何作用,这表明 Mac 的kill()语义在这方面与 Linux 的相同。

目前,我手边没有我愿意尝试的 Linux 机器,所以 Linuxinit用 SIGTERM 做什么的问题将不得不等待。 随着init像 Upstart 和 Systemd 这样的替代项目如今很流行,答案可能会有所不同。

更新:在 Linux 上,init明确忽略 SIGTERM,因此它什么都不做。@jsbillings 有关于Upstart 和 Systemd 做什么的信息。

  • 您可以使用 `Segmentation fault` (`SIGSEGV`) 信号杀死 `init`,这将导致内核崩溃:`kill -SEGV 1` (5认同)

jsb*_*ngs 15

SysV init 会忽略 SIGKILL 或 SIGTERM 信号。据我所知,导致状态变化的唯一信号是 SIGPWR,它安排与电源相关的关闭。

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

我不确定其他回答者正在运行什么,但我很确定你不能 kill -9 (SIGKILL) 或 kill -15 (SIGTERM) init (pid 1)。最有可能的是,如果您能够这样做,您会遇到内核恐慌,因为 init 意外退出并带有非零退出代码,这不太理想。它不会关闭您的计算机,或导致它重新启动。


Tok*_*Tok 8

从技术上讲是的,root 可以向 init 发出 SIGKILL。然而,init 与大多数(事实上几乎所有)其他进程的不同之处在于它允许捕获和忽略信号。

您可以松散地通过发出kill -TERM 1类似于发出 a 的 a来终止 init,halt或者shutdown在该 init 将信号传递给所有子进程,基本上是所有其他进程,然后再尊重信号本身。

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

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

  • 实际上,根据我的测试,`kill -TERM 1` 只会导致 init 在大多数 linux 系统上重新执行自身,并且导致系统关闭系统的唯一方法就是运行 `kill -压水堆 1` (4认同)

jon*_*scb 8

您可以重新启动该init过程。这对于inittab无需重新启动即可进行更改非常有用。

kill -HUP 1
Run Code Online (Sandbox Code Playgroud)

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

  • 在 `init` 的实现中,我知道这个信号不会使进程重新启动,而只是重新加载 `/etc/inittab` 文件。--- 相反,`systemctl daemon-reexec` 确实让`systemd`(Linux 上的`init` 替换)重新执行。 (3认同)

小智 6

sudo kill -INT 1(interrupt) 将重新启动系统,并且 sudo kill -SEGV 1, (分段违规) 或sudo kill -ABRT 1(abort) 将产生内核恐慌。

注意: sudo 是必需的。