21

I'm trying to get a graceful shutdown/reboot in ArchLinux with GNOME Shell. Now, when I ask for shut-down, it immediately shuts down without giving open programs time to gracefully close / save open files. As a result, whenever I restart Chrome (for example) it tells me that the session was not closed correctly etc. By reading on the web I learnt that systemd while shutting down processes, it first send a SIGTERM followed by SIGKILL if the process does not close withing a given timeout. However I notice that on my system SIGKILL is sent immediately after SIGTERM and I guess this is the cause of a non graceful programs termination.

I've found some documentation which (if I read it correctly) states that timeout before sending SIGKILL can be set by TimeoutStopSec= option. Also sending SIGKILL could also be disabled by SendSIGKILL= option. But I cannot find where to configure those options... is there a systemd shutdown / reboot configurations file where I can set those options?

EDIT:

I did some test and I discovered two interesting things:

  1. If I manually close chrome like this killall -SIGTERM chrome, it will not complain that is has not been closed correctly next time I start it again. If I close it like this instead killall -SIGKILL chrome, it will complain. This tells me that chrome is handling SIGTERM correctly.
  2. Looking at the output of my shutdown procedure, systemd prints Sending SIGTERM... immediately followed by Sending SIGKILL...

According to comment below, systemd is handling its processes only. So in my case GDM. This tells me that the issue could be:

  1. either GDM not closing it's child processes (e.g. Chrome) correctly (i.e. by sending SIGTERM to them)
  2. or systemd is sending GDM a SIGKILL message to early not giving it the time to correctly close its children.

Is there a way to check/configure how actually GDM closes its children?

  • 1
    Systemd only signals processes directly under it's control. Things like chrome are not one of those processes. Systemd will signal your display manager (xdm, gdm, kdm, whatever), it's then up to the display manager to signal its children, and so on down the line until you get to chrome. If nothing signals chrome, it dies when the xorg server is shut down and it's display goes away. – Patrick Apr 1 '14 at 16:37
  • @Patrick: thanks, I guessed so. That's why I tried adding 'TimeoutStopSec=90s' to '[Service]' section of ' /etc/systemd/system/display-manager.service' according to this: freedesktop.org/software/systemd/man/systemd.service.html but nothing changes... :( – lviggiani Apr 1 '14 at 16:51
  • Chrome should be under systemd's control - systemd is pid 1 - but Chrome execs out of its wrapper script in a subshell and invokes child processes afterward. Still, it will do what it needs to kill its zygotes so long as your system is properly configured. Are you using one of those temp-space solutions for chrome that you'll find recommended in the Arch wiki? – mikeserv Apr 3 '14 at 8:19
  • 1
    I run into a similar problem with KDE and Firefox on Arch. I have never gotten around to trying to figure out why. – StrongBad Apr 3 '14 at 8:53
  • 2
    GDM is not signaling processes. GDM is essentially a dumb way to hook up Xorg and PAM. the real culprit is gnome-session. – strugee Jun 30 '14 at 20:37
2

To gracefully shutdown your desktop, you may need to raise the TimeoutStopSec= for GDM, or whatever other display manager you are using.

  • Seems to me GDM should never have told systemd to shut down in the first place if it didn't know whether all clients could be closed. – enigmaticPhysicist May 3 '16 at 10:27
2

This worked for me on my Arch Linux with Gnome 3.12. It turned out that it maybe related to the config in /etc/gdm/PostSession/Default.

  1. Run sudo pacman -S wmctrl to install wmctrl for windows management.

  2. Create a executable file for closing all windows. For example, I put it in /home/[your_username]/bin/close-all-windows with these contents:

    #!/bin/sh
    wmctrl -l | while read -r line
    do
        wmctrl -c `echo "$line" | sed 's/.*  [0-9]* [your_hostname] //'`
    done
    
  3. Modify /etc/gdm/PostSession/Default and add these contents before exit 0:

    echo " Closing selected windows programs gracefully"
    export DISPLAY=:0
    su [your_username] -c /home/[your_username]/bin/close-all-windows
    

Hope these will work.

  • For Plasma 5, putting this script in .config/plasma-workspace/shutdown/ solves the problem – AF7 Mar 8 '16 at 8:30
-1

sorpass's wmctrl script works well for me (on CentOS 7 I just had to run 'yum install wmctrl' first). However I found that /etc/gdm/PostSession/Default only seemed to run only at logout, not shutdown. Therefore instead of using /etc/gdm/PostSession/Default I now call sorpass's wmctrl script from Seamus Phelan's python script which can be found at these two sites:

This combination of scripts works great for closing Firefox, Chrome, etc. automatically and cleanly when I logout or shutdown my CentOS 7 desktop machine. Note that with CentOS 7 you must run 'yum install gnome-python2-gnome' for this python script to work.

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Not the answer you're looking for? Browse other questions tagged or ask your own question.