“重新启动”命令是让我退出 shell 还是强制终止它?

Sam*_*rry 6 linux shell signals session reboot

在 Linux 下,如果我reboot从 shell发出命令,导致 shell(例如bash)断开连接的事件序列是什么?

我认为这是以下之一,但不确定是哪一个:

  1. 它在发送重新启动信号之前将我从外壳中注销。
  2. 它发送信号以重新启动并且外壳将我注销。
  3. 它发送重新启动的信号,shell 只是突然终止,而没有经过注销程序。

小智 3

这种行为可能会根据发行版/shell/配置而有所不同。在我的系统(Gentoo/SysVinit)上,当我运行reboot(可能是你的场景3)时会发生以下情况:

\n

重新启动命令委托关闭(来自man reboot):

\n
\n

如果在系统未处于运行级别 0 或\n6 时(换句话说,当系统正常运行时)调用暂停或重新引导,则将调用 shutdown(使用 -h 或 -r 标志)。有关详细信息,请参阅 shutdown(8) 联机帮助页。

\n
\n

所有进程(包括 shell)都会收到一个 SIGTERM,允许 3 秒进行清理(来自man shutdown):

\n
\n

所有进程首先都会收到 SIGTERM 信号\n系统即将关闭的通知。\n这使得像 vi(1) 这样的程序有时间保存正在编辑的文件,邮件和新闻处理程序有机会干净地退出,\netc。

\n
\n
\n

-t sec 告诉 init(8) 在更改到另一个运行\xe2\x80\x90 级别之前,在向所有进程发送警告 (SIGTERM) 和终止信号 (SIGKILL) 之间等待 sec 秒。如果未指定值,则这两个信号之间的默认时间为三秒。警告:当 shutdown\n调用 init 执行关闭(默认行为)时,init 检查是否所有进程都已终止,并在其子进程全部终止后提前停止等待。\nxe2\x80\x90\nated。当使用 -n 标志调用 shutdown 时,即使所有其他进程都已终止,它也会等待指定的完整时间(或三秒)。

\n
\n

Bash 实际上忽略了 SIGTERM(来自man bash):

\n
\n

当 bash 是交互式的时,在没有任何陷阱的情况下,它会忽略\nSIGTERM(因此 Kill 0 不会杀死交互式 shell)

\n
\n

因此init更改运行级别,(可能)发送另一个 SIGTERM,然后发送 SIGKILL (来自man init):

\n
\n

当 init 被请求更改运行级别时,它会向新运行级别中未定义的所有进程发送警告信号 SIGTERM。然后等待 3 秒,然后通过 SIGKILL 信号强制终止这些进程。

\n
\n

太长了;bash 将在没有正常关闭的情况下退出,其他程序可能会退出,但我不会依赖任何特定行为。

\n