我正在尝试使用 GNOME Shell 在 ArchLinux 中正常关闭/重新启动。现在,当我请求关闭时,它会立即关闭,而不会给打开的程序时间来正常关闭/保存打开的文件。因此,每当我重新启动 Chrome(例如)时,它都会告诉我会话未正确关闭等。通过在网上阅读,我了解到 systemd 在关闭进程时,它首先发送一个,SIGTERM
然后SIGKILL
如果进程没有关闭在给定的超时时间内。但是我注意到,在我的系统上,它SIGKILL
是在之后立即发送的SIGTERM
,我猜这是程序非正常终止的原因。
我找到了一些文档其中(如果我没读错的话)指出发送前的超时SIGKILL
可以通过选项设置TimeoutStopSec=
。SIGKILL
也可以通过选项禁用发送SendSIGKILL=
。但我找不到在哪里配置这些选项...是否有一个 systemd 关闭/重新启动配置文件,我可以在其中设置这些选项?
编辑:
我做了一些测试,发现了两个有趣的事情:
- 如果我像这样手动关闭chrome
killall -SIGTERM chrome
,下次我再次启动它时,它不会抱怨没有正确关闭。如果我像这样关闭它killall -SIGKILL chrome
,它会抱怨。这告诉我 chrome 正在正确处理 SIGTERM。 - 查看我的关闭过程的输出,systemd
Sending SIGTERM...
立即打印,然后是Sending SIGKILL...
根据下面的评论,systemd 仅处理其进程。所以就我而言,GDM。这告诉我问题可能是:
- GDM 没有正确关闭它的子进程(例如 Chrome)(即通过向它们发送 SIGTERM)
- 或者 systemd 正在向 GDM 发送 SIGKILL 消息,而没有给它足够的时间来正确关闭其子级。
有没有办法检查/配置 GDM 实际上如何关闭其子项?
答案1
要正常关闭桌面,您可能需要提高TimeoutStopSec=
GDM 或您正在使用的任何其他显示管理器的 。
答案2
这对我的 Arch Linux 和 Gnome 3.12 很有用。后来发现可能和里面的配置有关/etc/gdm/PostSession/Default
。
运行
sudo pacman -S wmctrl
安装 wmctrl 以进行 Windows 管理。创建用于关闭所有窗口的可执行文件。例如,我将其放入
/home/[your_username]/bin/close-all-windows
以下内容:#!/bin/sh wmctrl -l | while read -r line do wmctrl -c `echo "$line" | sed 's/.* [0-9]* [your_hostname] //'` done
修改
/etc/gdm/PostSession/Default
并添加之前的这些内容exit 0
:echo " Closing selected windows programs gracefully" export DISPLAY=:0 su [your_username] -c /home/[your_username]/bin/close-all-windows
希望这些能起作用。
答案3
sorpass 的 wmctrl 脚本对我来说效果很好(在 CentOS 7 上我只需要先运行 'yum install wmctrl')。但是我发现 /etc/gdm/PostSession/Default 似乎只在注销时运行,而不是在关闭时运行。因此,我现在不使用 /etc/gdm/PostSession/Default,而是从 Seamus Phelan 的 python 脚本调用 sorpass 的 wmctrl 脚本,该脚本可以在这两个站点找到:
- http://www.linuxquestions.org/questions/linux-desktop-74/gnome-run-script-on-logout-724453/#post3560301
- 如果我没有管理员权限,如何在 GNOME 注销期间运行脚本?
当我注销或关闭 CentOS 7 桌面计算机时,这种脚本组合非常适合自动、干净地关闭 Firefox、Chrome 等。请注意,在 CentOS 7 中,您必须运行“yum install gnome-python2-gnome”才能使此 python 脚本正常工作。