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则不然。

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

对于它的价值,不久前,我在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的问题。

实际上,Ask上提供了关闭所有窗口并且不依赖于任何特定DE的脚本的一部分。 第二和第三个答案特别有用。 只需几行,并通过在面板或桌面上创建启动器,您可以实现在您正在使用的DE中工作的优雅关闭。

如何优雅地关闭所有打开的窗口