当前位置: 首页>>技术教程>>正文


Ubuntu 在关闭时不发送 SIGTERM

问题描述

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

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

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

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

我运行的是 Ubuntu 16.04,但问题也存在于 15.10 中。我不知道它以前是否存在,因为我开始使用Ubuntu时15.10是最新版本。

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

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

最佳答案

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

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

$ pkill firefox

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

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

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

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

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

参考资料

本文由Ubuntu问答整理, 博文地址: https://ubuntuqa.com/article/13769.html,未经允许,请勿转载。