[systemd-devel] [PATCH] man: document kill behavior after the main process exits

Daniel Drake drake at endlessm.com
Thu Apr 23 08:20:41 PDT 2015


While looking at the exact behavior of how systemd stops services,
I encountered some behavior that wasn't clear from reading the man
page.

Specifically, if the main process exits before its children, the child
processes will actually receive a second SIGTERM. If that doesn't
kill them, they will later receive a SIGKILL too, even if
SendSIGKILL=no. Add some notes about this.
---
 man/systemd.kill.xml | 30 ++++++++++++++++++++++++++++--
 1 file changed, 28 insertions(+), 2 deletions(-)

Thanks for helping me to get to the bottom of this in the thread:
  Zombie process still exists after stopping gdm.service

unit_kill_context() has a comment which is relevant here:

   /* FIXME: For now, we will not wait for the
    * cgroup members to die, simply because
    * cgroup notification is unreliable. It
    * doesn't work at all in containers, and
    * outside of containers it can be confused
    * easily by leaving directories in the
    * cgroup. */

   /* wait_for_exit = true; */

When this is fixed, assumed to happen soon, the precise behaviour seen
in the discussion will change slightly (in terms of timing).

So I have carefully written this documentation patch in a way that does
not go into the timing details. The text changed below should therefore
be true both before and after that FIXME is resolved.

diff --git a/man/systemd.kill.xml b/man/systemd.kill.xml
index e57f0e7..10232fb 100644
--- a/man/systemd.kill.xml
+++ b/man/systemd.kill.xml
@@ -154,8 +154,9 @@
         <term><varname>SendSIGKILL=</varname></term>
         <listitem><para>Specifies whether to send
         <constant>SIGKILL</constant> to remaining processes after a
-        timeout, if the normal shutdown procedure left processes of
-        the service around. Takes a boolean value. Defaults to "yes".
+        timeout, if the normal shutdown procedure didn't succeed in
+        shutting down the main process. Takes a boolean value.
+        Defaults to "yes".
         </para></listitem>
       </varlistentry>
 
@@ -163,6 +164,31 @@
   </refsect1>
 
   <refsect1>
+    <title>Beyond the main process</title>
+
+     <para>The <varname>KillMode=</varname> option primarily defines
+     behavior up until the point where the main process has gone away.
+     systemd expects that when killed with the signal specified by
+     <varname>KillSignal=</varname>, the main process will kill and
+     reap all the other processes in the control group before
+     exiting itself. If that doesn't happen, and the main process
+     exits with other processes still running in the control group,
+     systemd gets a bit more heavy-handed:</para>
+
+     <para>If <option>KillMode=control-group</option>, systemd will
+     then send a second <varname>KillSignal=</varname> signal to the
+     remaining processes, which will then be followed by a
+     <constant>SIGKILL</constant> if processes are still around, even
+     if <option>SendSIGKILL=no</option>.</para>
+
+     <para>Or, if <option>KillMode=mixed</option>, systemd will
+     directly send <constant>SIGKILL</constant> to all remaining members
+     of the control group, regardless of the
+     <varname>SendSIGKILL=</varname> preference.</para>
+
+  </refsect1>
+
+  <refsect1>
       <title>See Also</title>
       <para>
         <citerefentry><refentrytitle>systemd</refentrytitle><manvolnum>1</manvolnum></citerefentry>,
-- 
2.1.0



More information about the systemd-devel mailing list