Ubuntu在关机时未发送SIGTERM


21

我开始怀疑Ubuntu不会告诉正在运行的应用程序正在关闭以使其正确退出,而是强迫它们退出。

如果我在关闭时将chrome保持打开状态,则表示上次引导后再次打开它时无法正确关闭,LibreOffice不会询问我是否要保存文档,而是正在制作需要运行一些代码的应用程序退出时,但在计算机关闭时不允许这样做。

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

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

我正在运行Ubuntu 16.04,但该问题也存在于15.10中。自从我开始使用Ubuntu 10.10的最新版本以来,我就无法知道它是否存在。

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

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


你怎么关机
terdon

1
Chromium和LibreOffice并未按照您希望的方式处理SIGTERM
Andrea Corbellini 2016年

2
我不确定我理解你的意思。您是说他们没有正确处理SIGTERM吗?也许他们没有,但是正如我在问题中所写的那样,我正在开发一个可处理SIGTERM的程序,但该代码似乎从未运行过。按住Ctrl + C时的SIGINT效果很好。我仍然相信关于Ubuntu在关闭时通知正在运行的进程存在一些问题。
GKraft


2
不得不手动关闭所有应用程序会很烦人,如果您忘记了最小化的应用程序怎么办?它不会保存您的工作。而且,有许多后台流程您要么无法轻松控制,要么就不考虑了。他们将没有机会自行清理或保存所做的任何事情。
GKraft

Answers:


3

不幸的是,这种方式并不完全有效。许多实际上具有信号处理程序的程序都不会阻塞信号以显示确认对话框。信号处理通常很少或丢失。

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

$ pkill firefox

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

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

关闭窗口时,程序不会急于关闭,它可以关闭该窗口中的所有内容,例如打开的选项卡,如果有未保存的工作,它还可以显示一个对话框窗口。一旦关闭了应用程序的所有打开的窗口,该过程通常在此后不久终止。

因此,这取决于您的桌面环境(假设您使用桌面环境关闭而不是关闭sudo poweroff)。例如,KDE应该先关闭打开的窗口再关闭,而MATE则不然。

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


我看到关机过程和信号处理没有完全按照我的想法工作。现在,我了解了它应该如何工作以及为什么它没有按我预期的那样工作。
GKraft

0

值得一提的是,前一段时间,我在Manjaro论坛上找到了以下程序:

close_apps () {
WIN_IDs=$(wmctrl -l | grep -vwE "Desktop$|xfce4-panel$" | cut -f1 -d' ')
for i in $WIN_IDs; do wmctrl -ic "$i"; done

# Keep checking and waiting until all windows are closed
while [ "$WIN_IDs" != "" ]; do
        sleep 0.1;
        WIN_IDs=$(wmctrl -l | grep -vwE "Desktop$|xfce4-panel$" | cut -f1 -d' ')
done

}

您可以在自己的脚本中调用它,以在关机(或重新启动)之前关闭所有打开的应用程序。

唯一的问题是,它是为Xfce创建的,因此需要Unity DE施加的更改。这里有一些知识渊博的人的帮助,可以帮助解决OP的问题。


几天之内我将无法访问我的计算机,因此即使它已纠正,我也无法尝试。真的有必要使用这样的脚本吗?我认为ubuntu shoukd会自己处理。
GKraft

同意 不过,它在Xubuntu中可以完美运行。例如,如果有未保存的文档,关机将无限期地等待。
SR

0

实际上,可以在Ask上获得关闭所有窗口且不依赖于任何特定DE的脚本的一部分。第二和第三答案特别有用。仅需几行,并且通过在面板或桌面上创建启动器,就可以实现在所用DE中正常运行的功能。

如何正常关闭所有打开的窗口


他们似乎很有前途。我可能最终会使用类似的脚本。
GKraft
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.