Ubuntu 在关机时不发送 SIGTERM

GKr*_*aft 21 shutdown

我开始怀疑 Ubuntu 并没有告诉正在运行的应用程序它正在关闭以让它们正确退出,而是强制它们退出。

如果我在关闭时让 chrome 保持打开状态,它说上次启动后再次打开它时它没有正确关闭,LibreOffice 不会询问我是否要保存我的文档,并且我正在制作一个需要运行一些代码的应用程序退出,但在计算机关闭时不允许这样做。

据我了解,SIGTERM 首先发送到所有进程以允许它们干净地退出,如果它们不退出,则发送 SIGKILL 以强制它们退出。看来 Ubuntu 要么根本不发送 SIGTERM,要么在发送 SIGKILL 之前没有给应用程序足够的时间。

有什么办法可以解决这个问题吗?

我正在运行 Ubuntu 16.04,但问题也存在于 15.10 中。自从我在 15.10 是最新版本时开始使用 Ubuntu 以来,我不知道它是否存在过。

编辑:我使用 Unity 并通过按下右上角的齿轮并选择关闭来关闭我的计算机,但如果sudo halt在终端中运行,问题是相同的。

编辑:我仅在注销时观察到相同的行为。我的猜测是该信号应该在注销时发送,因此在关机和注销时会出现问题。

c0x*_*0xc 3

不幸的是,它并不完全按照这种方式工作。许多实际上有信号处理程序的程序不会阻止信号来显示确认对话框。信号处理通常很少或缺失。

您无需关机即可轻松尝试。只需将 SIGTERM 发送到正在运行的 Firefox 或 LibreOffice 进程即可:

$ pkill firefox
Run Code Online (Sandbox Code Playgroud)

通常,Firefox 可能会询问您是否确实要关闭它。此外,它通常需要一段时间才能关闭,特别是当它运行了很长时间并使用超过 1 GB 的 RAM 时 - 在最后一个窗口关闭后,进程通常需要一分钟才能终止。当您发送 SIGTERM 时,这一切都不会发生,进程只是立即终止。

但是,某些桌面环境会在关闭之前关闭所有打开的窗口。与 SIGTERM 不同,以编程方式关闭窗口就像单击该窗口的 X 按钮或Alt+ F4。这也是另一个答案中的脚本所做的 - 它使用 wmctrl 优雅地关闭所有打开的窗口。

当窗口关闭时,程序并不着急,它可以关闭该窗口中的所有内容,例如打开的选项卡,如果有未保存的工作,它还可以显示一个对话框窗口。一旦应用程序的所有打开的窗口都被关闭,该进程通常会很快终止。

所以这取决于您的桌面环境(假设您使用桌面环境来关闭而不是sudo poweroff)。例如,KDE 应等待打开的窗口关闭后再关闭,而 MATE 则不然。

底线:在关闭之前手动关闭所有打开的窗口。或者使用等待所有窗口关闭的桌面环境。