在ArchLinux中正常关机


21

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

我找到了一些文档(如果我没看错的话),说明SIGKILL可以通过TimeoutStopSec=选项设置发送前的超时时间。SIGKILL也可以通过SendSIGKILL=选项禁用发送。但是我找不到在哪里配置这些选项的信息...是否有一个systemd shutdown / reboot配置文件可以在其中设置这些选项?

编辑:

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

  1. 如果我这样手动关闭chrome killall -SIGTERM chrome,它将不会抱怨下次再次启动时未正确关闭。如果我这样关闭它killall -SIGKILL chrome,它将抱怨。这告诉我chrome正在正确处理SIGTERM。
  2. 查看关闭程序的输出,systemd Sending SIGTERM...立即打印Sending SIGKILL...

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

  1. 两个GDM未能正确关闭其子进程(例如Chrome)(即通过向其发送SIGTERM)
  2. 或systemd向GDM发送SIGKILL消息的时间过早,没有给它时间正确关闭其子级。

有没有一种方法可以检查/配置GDM实际上如何关闭其子级?


1
Systemd仅表示直接在其控制下的进程。像chrome这样的东西不是那些过程之一。Systemd会向您的显示管理器发出信号(xdm,gdm,kdm,等等),然后由显示管理器向其子进程发出信号,依此类推,直到您进入chrome。如果没有任何信号表示chrome,则xorg服务器关闭时它会死,并且其显示消失。
Patrick

@帕特里克:谢谢,我猜是这样。这就是为什么我尝试根据以下内容在“ /etc/systemd/system/display-manager.service”的“ [Service]”部分中添加“ TimeoutStopSec = 90s”的原因:freedesktop.org/software/systemd/man/systemd.service html但没有任何变化... :(
lviggiani 2014年

Chrome 应该受到systemd's控制- systemdpid 1-但Chrome会在子外壳程序中执行其包装程序脚本,然后再调用子进程。zygotes只要系统配置正确,它就可以执行杀死其所需的操作。您是否正在使用Arch Wiki中推荐的用于chrome的时空解决方案之一?
mikeserv

1
我在Arch上遇到了KDE和Firefox的类似问题。我从来没有绕过试图找出原因。
2014年

2
GDM不是信令过程。GDM本质上是连接Xorg和PAM的愚蠢方式。真正的罪魁祸首是gnome-session
2014年

Answers:


2

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


在我看来,如果GDM不知道是否可以关闭所有客户端,那么它首先不应告诉systemd关闭。
enigmaticPhysicist

2

这在使用Gnome 3.12的Arch Linux上对我有用。原来,这可能与中的配置有关/etc/gdm/PostSession/Default

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

  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
    

希望这些能起作用。


对于Plasma 5,将此脚本放在.config / plasma-workspace / shutdown /中即可解决问题
AF7,2016年

-1

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脚本正常工作。

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.