systemd `systemctl stop` aggressively kills subprocesses

GoZoner picture GoZoner · Nov 30, 2016 · Viewed 9.9k times · Source

I've a daemon-like process that starts two subprocesses (and one of the subprocesses starts ~10 others). When I systemctl stop my process the child subprocesses appear to be 'aggressively' killed by systemctl - which doesn't give my process a chance to clean up.

How do I get systemctl stop to quit the aggressive kill and thus to allow my process to orchestrate an orderly clean up?

I tried timeoutSec=30 to no avail.

Answer

Benjamin Franzke picture Benjamin Franzke · Dec 5, 2016

KillMode= [1] defaults to control-group. That means every process of your service is killed with SIGTERM.

You have two options:

  • Handle SIGTERM in each of your processes and shutdown within TimeoutStopSec (which defaults to 90 seconds [2])
  • If you really want to delegate the shutdown from your main process, set KillMode=mixed. SIGTERM will be sent to the main process only. Then again shutdown within TimeoutStopSec. If you do not shutdown within TimeoutStopSec, systemd will send SIGKILL to all your processes.

Note: I suggest to use KillMode=mixed in option 2 instead of KillMode=process, as the latter would send the final SIGKILL only to your main process, which means your sub-processes would not be killed if they've locked up.

[1] https://www.freedesktop.org/software/systemd/man/systemd.kill.html#KillMode=

[2] https://www.freedesktop.org/software/systemd/man/systemd-system.conf.html#DefaultTimeoutStartSec=