ArchLinux 中的正常关闭

ArchLinux 中的正常关闭

我正在尝试使用 GNOME Shell 在 ArchLinux 中正常关闭/重新启动。现在,当我请求关闭时,它会立即关闭,而不会给打开的程序时间来正常关闭/保存打开的文件。因此,每当我重新启动 Chrome(例如)时,它都会告诉我会话未正确关闭等。通过在网上阅读,我了解到 systemd 在关闭进程时,它首先发送一个,SIGTERM然后SIGKILL如果进程没有关闭在给定的超时时间内。但是我注意到,在我的系统上,它SIGKILL是在之后立即发送的SIGTERM,我猜这是程序非正常终止的原因。

我找到了一些文档其中(如果我没读错的话)指出发送前的超时SIGKILL可以通过选项设置TimeoutStopSec=SIGKILL也可以通过选项禁用发送SendSIGKILL=。但我找不到在哪里配置这些选项...是否有一个 systemd 关闭/重新启动配置文件,我可以在其中设置这些选项?

编辑:

我做了一些测试,发现了两个有趣的事情:

  1. 如果我像这样手动关闭chrome killall -SIGTERM chrome,下次我再次启动它时,它不会抱怨没有正确关闭。如果我像这样关闭它killall -SIGKILL chrome,它会抱怨。这告诉我 chrome 正在正确处理 SIGTERM。
  2. 查看我的关闭过程的输出,systemdSending SIGTERM...立即打印,然后是Sending SIGKILL...

根据下面的评论,systemd 仅处理其进程。所以就我而言,GDM。这告诉我问题可能是:

  1. GDM 没有正确关闭它的子进程(例如 Chrome)(即通过向它们发送 SIGTERM)
  2. 或者 systemd 正在向 GDM 发送 SIGKILL 消息,而没有给它足够的时间来正确关闭其子级。

有没有办法检查/配置 GDM 实际上如何关闭其子项?

答案1

要正常关闭桌面,您可能需要提高TimeoutStopSec=GDM 或您正在使用的任何其他显示管理器的 。

答案2

这对我的 Arch Linux 和 Gnome 3.12 很有用。后来发现可能和里面的配置有关/etc/gdm/PostSession/Default

  1. 运行sudo pacman -S wmctrl安装 wmctrl 以进行 Windows 管理。

  2. 创建用于关闭所有窗口的可执行文件。例如,我将其放入/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
    
  3. 修改/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 脚本,该脚本可以在这两个站点找到:

当我注销或关闭 CentOS 7 桌面计算机时,这种脚本组合非常适合自动、干净地关闭 Firefox、Chrome 等。请注意,在 CentOS 7 中,您必须运行“yum install gnome-python2-gnome”才能使此 python 脚本正常工作。

相关内容