unit: split off KillContext from ExecContext containing only kill definitions
This commit is contained in:
parent
f8813ec795
commit
4819ff0358
|
@ -455,6 +455,7 @@ MANPAGES = \
|
||||||
man/systemd.device.5 \
|
man/systemd.device.5 \
|
||||||
man/systemd.snapshot.5 \
|
man/systemd.snapshot.5 \
|
||||||
man/systemd.exec.5 \
|
man/systemd.exec.5 \
|
||||||
|
man/systemd.kill.5 \
|
||||||
man/systemd.special.7 \
|
man/systemd.special.7 \
|
||||||
man/systemd.journal-fields.7 \
|
man/systemd.journal-fields.7 \
|
||||||
man/kernel-command-line.7 \
|
man/kernel-command-line.7 \
|
||||||
|
@ -904,6 +905,8 @@ libsystemd_core_la_SOURCES = \
|
||||||
src/core/load-dropin.h \
|
src/core/load-dropin.h \
|
||||||
src/core/execute.c \
|
src/core/execute.c \
|
||||||
src/core/execute.h \
|
src/core/execute.h \
|
||||||
|
src/core/kill.c \
|
||||||
|
src/core/kill.h \
|
||||||
src/core/dbus.c \
|
src/core/dbus.c \
|
||||||
src/core/dbus.h \
|
src/core/dbus.h \
|
||||||
src/core/dbus-manager.c \
|
src/core/dbus-manager.c \
|
||||||
|
@ -932,6 +935,8 @@ libsystemd_core_la_SOURCES = \
|
||||||
src/core/dbus-device.h \
|
src/core/dbus-device.h \
|
||||||
src/core/dbus-execute.c \
|
src/core/dbus-execute.c \
|
||||||
src/core/dbus-execute.h \
|
src/core/dbus-execute.h \
|
||||||
|
src/core/dbus-kill.c \
|
||||||
|
src/core/dbus-kill.h \
|
||||||
src/core/dbus-path.c \
|
src/core/dbus-path.c \
|
||||||
src/core/dbus-path.h \
|
src/core/dbus-path.h \
|
||||||
src/core/cgroup.c \
|
src/core/cgroup.c \
|
||||||
|
|
|
@ -1152,7 +1152,8 @@
|
||||||
<citerefentry><refentrytitle>systemd.service</refentrytitle><manvolnum>5</manvolnum></citerefentry>,
|
<citerefentry><refentrytitle>systemd.service</refentrytitle><manvolnum>5</manvolnum></citerefentry>,
|
||||||
<citerefentry><refentrytitle>systemd.socket</refentrytitle><manvolnum>5</manvolnum></citerefentry>,
|
<citerefentry><refentrytitle>systemd.socket</refentrytitle><manvolnum>5</manvolnum></citerefentry>,
|
||||||
<citerefentry><refentrytitle>systemd.swap</refentrytitle><manvolnum>5</manvolnum></citerefentry>,
|
<citerefentry><refentrytitle>systemd.swap</refentrytitle><manvolnum>5</manvolnum></citerefentry>,
|
||||||
<citerefentry><refentrytitle>systemd.mount</refentrytitle><manvolnum>5</manvolnum></citerefentry>
|
<citerefentry><refentrytitle>systemd.mount</refentrytitle><manvolnum>5</manvolnum></citerefentry>,
|
||||||
|
<citerefentry><refentrytitle>systemd.kill</refentrytitle><manvolnum>5</manvolnum></citerefentry>
|
||||||
</para>
|
</para>
|
||||||
</refsect1>
|
</refsect1>
|
||||||
|
|
||||||
|
|
|
@ -0,0 +1,170 @@
|
||||||
|
<?xml version='1.0'?> <!--*-nxml-*-->
|
||||||
|
<?xml-stylesheet type="text/xsl" href="http://docbook.sourceforge.net/release/xsl/current/xhtml/docbook.xsl"?>
|
||||||
|
<!DOCTYPE refentry PUBLIC "-//OASIS//DTD DocBook XML V4.2//EN"
|
||||||
|
"http://www.oasis-open.org/docbook/xml/4.2/docbookx.dtd">
|
||||||
|
|
||||||
|
<!--
|
||||||
|
This file is part of systemd.
|
||||||
|
|
||||||
|
Copyright 2012 Lennart Poettering
|
||||||
|
|
||||||
|
systemd is free software; you can redistribute it and/or modify it
|
||||||
|
under the terms of the GNU Lesser General Public License as published by
|
||||||
|
the Free Software Foundation; either version 2.1 of the License, or
|
||||||
|
(at your option) any later version.
|
||||||
|
|
||||||
|
systemd is distributed in the hope that it will be useful, but
|
||||||
|
WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||||
|
Lesser General Public License for more details.
|
||||||
|
|
||||||
|
You should have received a copy of the GNU Lesser General Public License
|
||||||
|
along with systemd; If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
-->
|
||||||
|
|
||||||
|
<refentry id="systemd.kill">
|
||||||
|
<refentryinfo>
|
||||||
|
<title>systemd.kill</title>
|
||||||
|
<productname>systemd</productname>
|
||||||
|
|
||||||
|
<authorgroup>
|
||||||
|
<author>
|
||||||
|
<contrib>Developer</contrib>
|
||||||
|
<firstname>Lennart</firstname>
|
||||||
|
<surname>Poettering</surname>
|
||||||
|
<email>lennart@poettering.net</email>
|
||||||
|
</author>
|
||||||
|
</authorgroup>
|
||||||
|
</refentryinfo>
|
||||||
|
|
||||||
|
<refmeta>
|
||||||
|
<refentrytitle>systemd.kill</refentrytitle>
|
||||||
|
<manvolnum>5</manvolnum>
|
||||||
|
</refmeta>
|
||||||
|
|
||||||
|
<refnamediv>
|
||||||
|
<refname>systemd.kill</refname>
|
||||||
|
<refpurpose>Kill environment configuration</refpurpose>
|
||||||
|
</refnamediv>
|
||||||
|
|
||||||
|
<refsynopsisdiv>
|
||||||
|
<para><filename>systemd.service</filename>,
|
||||||
|
<filename>systemd.socket</filename>,
|
||||||
|
<filename>systemd.mount</filename>,
|
||||||
|
<filename>systemd.swap</filename></para>
|
||||||
|
</refsynopsisdiv>
|
||||||
|
|
||||||
|
<refsect1>
|
||||||
|
<title>Description</title>
|
||||||
|
|
||||||
|
<para>Unit configuration files for services, sockets,
|
||||||
|
mount points and swap devices share a subset of
|
||||||
|
configuration options which define the process killing
|
||||||
|
parameters of spawned processes.</para>
|
||||||
|
|
||||||
|
<para>This man page lists the configuration options
|
||||||
|
shared by these four unit types. See
|
||||||
|
<citerefentry><refentrytitle>systemd.unit</refentrytitle><manvolnum>5</manvolnum></citerefentry>
|
||||||
|
for the common options of all unit configuration
|
||||||
|
files, and
|
||||||
|
<citerefentry><refentrytitle>systemd.service</refentrytitle><manvolnum>5</manvolnum></citerefentry>,
|
||||||
|
<citerefentry><refentrytitle>systemd.socket</refentrytitle><manvolnum>5</manvolnum></citerefentry>,
|
||||||
|
<citerefentry><refentrytitle>systemd.swap</refentrytitle><manvolnum>5</manvolnum></citerefentry>
|
||||||
|
and
|
||||||
|
<citerefentry><refentrytitle>systemd.mount</refentrytitle><manvolnum>5</manvolnum></citerefentry>
|
||||||
|
for more information on the specific unit
|
||||||
|
configuration files. The execution specific
|
||||||
|
configuration options are configured in the [Service],
|
||||||
|
[Socket], [Mount] resp. [Swap] section, depending on the unit
|
||||||
|
type.</para>
|
||||||
|
</refsect1>
|
||||||
|
|
||||||
|
<refsect1>
|
||||||
|
<title>Options</title>
|
||||||
|
|
||||||
|
<variablelist>
|
||||||
|
|
||||||
|
<varlistentry>
|
||||||
|
<term><varname>KillMode=</varname></term>
|
||||||
|
<listitem><para>Specifies how
|
||||||
|
processes of this service shall be
|
||||||
|
killed. One of
|
||||||
|
<option>control-group</option>,
|
||||||
|
<option>process</option>,
|
||||||
|
<option>none</option>.</para>
|
||||||
|
|
||||||
|
<para>If set to
|
||||||
|
<option>control-group</option> all
|
||||||
|
remaining processes in the control
|
||||||
|
group of this unit will be terminated
|
||||||
|
on unit stop (for services: after the
|
||||||
|
stop command is executed, as
|
||||||
|
configured with
|
||||||
|
<varname>ExecStop=</varname>). If set
|
||||||
|
to <option>process</option> only the
|
||||||
|
main process itself is killed. If set
|
||||||
|
to <option>none</option> no process is
|
||||||
|
killed. In this case only the stop
|
||||||
|
command will be executed on unit
|
||||||
|
stop, but no process be killed
|
||||||
|
otherwise. Processes remaining alive
|
||||||
|
after stop are left in their control
|
||||||
|
group and the control group continues
|
||||||
|
to exist after stop unless it is
|
||||||
|
empty. Defaults to
|
||||||
|
<option>control-group</option>.</para>
|
||||||
|
|
||||||
|
<para>Processes will first be
|
||||||
|
terminated via SIGTERM (unless the
|
||||||
|
signal to send is changed via
|
||||||
|
<varname>KillSignal=</varname>). If
|
||||||
|
then after a delay (configured via the
|
||||||
|
<varname>TimeoutSec=</varname> option)
|
||||||
|
processes still remain, the
|
||||||
|
termination request is repeated with
|
||||||
|
the SIGKILL signal (unless this is
|
||||||
|
disabled via the
|
||||||
|
<varname>SendSIGKILL=</varname>
|
||||||
|
option). See
|
||||||
|
<citerefentry><refentrytitle>kill</refentrytitle><manvolnum>2</manvolnum></citerefentry>
|
||||||
|
for more
|
||||||
|
information.</para></listitem>
|
||||||
|
</varlistentry>
|
||||||
|
|
||||||
|
<varlistentry>
|
||||||
|
<term><varname>KillSignal=</varname></term>
|
||||||
|
<listitem><para>Specifies which signal
|
||||||
|
to use when killing a
|
||||||
|
service. Defaults to SIGTERM.
|
||||||
|
</para></listitem>
|
||||||
|
</varlistentry>
|
||||||
|
|
||||||
|
<varlistentry>
|
||||||
|
<term><varname>SendSIGKILL=</varname></term>
|
||||||
|
<listitem><para>Specifies whether to
|
||||||
|
send SIGKILL to remaining processes
|
||||||
|
after a timeout, if the normal
|
||||||
|
shutdown procedure left processes of
|
||||||
|
the service around. Takes a boolean
|
||||||
|
value. Defaults to "yes".
|
||||||
|
</para></listitem>
|
||||||
|
</varlistentry>
|
||||||
|
</variablelist>
|
||||||
|
</refsect1>
|
||||||
|
|
||||||
|
<refsect1>
|
||||||
|
<title>See Also</title>
|
||||||
|
<para>
|
||||||
|
<citerefentry><refentrytitle>systemd</refentrytitle><manvolnum>1</manvolnum></citerefentry>,
|
||||||
|
<citerefentry><refentrytitle>systemctl</refentrytitle><manvolnum>8</manvolnum></citerefentry>,
|
||||||
|
<citerefentry><refentrytitle>journalctl</refentrytitle><manvolnum>8</manvolnum></citerefentry>,
|
||||||
|
<citerefentry><refentrytitle>systemd.unit</refentrytitle><manvolnum>5</manvolnum></citerefentry>,
|
||||||
|
<citerefentry><refentrytitle>systemd.service</refentrytitle><manvolnum>5</manvolnum></citerefentry>,
|
||||||
|
<citerefentry><refentrytitle>systemd.socket</refentrytitle><manvolnum>5</manvolnum></citerefentry>,
|
||||||
|
<citerefentry><refentrytitle>systemd.swap</refentrytitle><manvolnum>5</manvolnum></citerefentry>,
|
||||||
|
<citerefentry><refentrytitle>systemd.mount</refentrytitle><manvolnum>5</manvolnum></citerefentry>,
|
||||||
|
<citerefentry><refentrytitle>systemd.exec</refentrytitle><manvolnum>5</manvolnum></citerefentry>
|
||||||
|
</para>
|
||||||
|
</refsect1>
|
||||||
|
|
||||||
|
</refentry>
|
|
@ -72,7 +72,10 @@
|
||||||
<citerefentry><refentrytitle>systemd.exec</refentrytitle><manvolnum>5</manvolnum></citerefentry>,
|
<citerefentry><refentrytitle>systemd.exec</refentrytitle><manvolnum>5</manvolnum></citerefentry>,
|
||||||
which define the execution environment the
|
which define the execution environment the
|
||||||
<citerefentry><refentrytitle>mount</refentrytitle><manvolnum>8</manvolnum></citerefentry>
|
<citerefentry><refentrytitle>mount</refentrytitle><manvolnum>8</manvolnum></citerefentry>
|
||||||
binary is executed in.</para>
|
binary is executed in, and in
|
||||||
|
<citerefentry><refentrytitle>systemd.kill</refentrytitle><manvolnum>5</manvolnum></citerefentry>
|
||||||
|
which define the way the processes are
|
||||||
|
terminated.</para>
|
||||||
|
|
||||||
<para>Mount units must be named after the mount point
|
<para>Mount units must be named after the mount point
|
||||||
directories they control. Example: the mount point
|
directories they control. Example: the mount point
|
||||||
|
@ -147,7 +150,9 @@
|
||||||
supervises. A number of options that may be used in
|
supervises. A number of options that may be used in
|
||||||
this section are shared with other unit types. These
|
this section are shared with other unit types. These
|
||||||
options are documented in
|
options are documented in
|
||||||
<citerefentry><refentrytitle>systemd.exec</refentrytitle><manvolnum>5</manvolnum></citerefentry>. The
|
<citerefentry><refentrytitle>systemd.exec</refentrytitle><manvolnum>5</manvolnum></citerefentry>
|
||||||
|
and
|
||||||
|
<citerefentry><refentrytitle>systemd.kill</refentrytitle><manvolnum>5</manvolnum></citerefentry>. The
|
||||||
options specific to the [Mount] section of mount
|
options specific to the [Mount] section of mount
|
||||||
units are the following:</para>
|
units are the following:</para>
|
||||||
|
|
||||||
|
@ -220,50 +225,21 @@
|
||||||
will be terminated forcibly via
|
will be terminated forcibly via
|
||||||
SIGTERM, and after another delay of
|
SIGTERM, and after another delay of
|
||||||
this time with SIGKILL. (See
|
this time with SIGKILL. (See
|
||||||
<option>KillMode=</option> below.)
|
<option>KillMode=</option> in
|
||||||
|
<citerefentry><refentrytitle>systemd.kill</refentrytitle><manvolnum>5</manvolnum></citerefentry>.)
|
||||||
Takes a unit-less value in seconds, or
|
Takes a unit-less value in seconds, or
|
||||||
a time span value such as "5min
|
a time span value such as "5min
|
||||||
20s". Pass 0 to disable the timeout
|
20s". Pass 0 to disable the timeout
|
||||||
logic. Defaults to
|
logic. Defaults to
|
||||||
90s.</para></listitem>
|
90s.</para></listitem>
|
||||||
</varlistentry>
|
</varlistentry>
|
||||||
|
|
||||||
<varlistentry>
|
|
||||||
<term><varname>KillMode=</varname></term>
|
|
||||||
<listitem><para>Specifies how
|
|
||||||
processes of this mount shall be
|
|
||||||
killed. One of
|
|
||||||
<option>control-group</option>,
|
|
||||||
<option>process</option>,
|
|
||||||
<option>none</option>.</para>
|
|
||||||
|
|
||||||
<para>This option is mostly equivalent
|
|
||||||
to the <option>KillMode=</option>
|
|
||||||
option of service files. See
|
|
||||||
<citerefentry><refentrytitle>systemd.service</refentrytitle><manvolnum>5</manvolnum></citerefentry>
|
|
||||||
for details.</para></listitem>
|
|
||||||
</varlistentry>
|
|
||||||
|
|
||||||
<varlistentry>
|
|
||||||
<term><varname>KillSignal=</varname></term>
|
|
||||||
<listitem><para>Specifies which signal
|
|
||||||
to use when killing a process of this
|
|
||||||
mount. Defaults to SIGTERM.
|
|
||||||
</para></listitem>
|
|
||||||
</varlistentry>
|
|
||||||
|
|
||||||
<varlistentry>
|
|
||||||
<term><varname>SendSIGKILL=</varname></term>
|
|
||||||
<listitem><para>Specifies whether to
|
|
||||||
send SIGKILL to remaining processes
|
|
||||||
after a timeout, if the normal
|
|
||||||
shutdown procedure left processes of
|
|
||||||
the mount around. Takes a boolean
|
|
||||||
value. Defaults to "yes".
|
|
||||||
</para></listitem>
|
|
||||||
</varlistentry>
|
|
||||||
|
|
||||||
</variablelist>
|
</variablelist>
|
||||||
|
|
||||||
|
<para>Check
|
||||||
|
<citerefentry><refentrytitle>systemd.exec</refentrytitle><manvolnum>5</manvolnum></citerefentry>
|
||||||
|
and
|
||||||
|
<citerefentry><refentrytitle>systemd.kill</refentrytitle><manvolnum>5</manvolnum></citerefentry>
|
||||||
|
for more settings.</para>
|
||||||
</refsect1>
|
</refsect1>
|
||||||
|
|
||||||
<refsect1>
|
<refsect1>
|
||||||
|
@ -295,6 +271,7 @@
|
||||||
<citerefentry><refentrytitle>systemctl</refentrytitle><manvolnum>8</manvolnum></citerefentry>,
|
<citerefentry><refentrytitle>systemctl</refentrytitle><manvolnum>8</manvolnum></citerefentry>,
|
||||||
<citerefentry><refentrytitle>systemd.unit</refentrytitle><manvolnum>5</manvolnum></citerefentry>,
|
<citerefentry><refentrytitle>systemd.unit</refentrytitle><manvolnum>5</manvolnum></citerefentry>,
|
||||||
<citerefentry><refentrytitle>systemd.exec</refentrytitle><manvolnum>5</manvolnum></citerefentry>,
|
<citerefentry><refentrytitle>systemd.exec</refentrytitle><manvolnum>5</manvolnum></citerefentry>,
|
||||||
|
<citerefentry><refentrytitle>systemd.kill</refentrytitle><manvolnum>5</manvolnum></citerefentry>,
|
||||||
<citerefentry><refentrytitle>systemd.service</refentrytitle><manvolnum>5</manvolnum></citerefentry>,
|
<citerefentry><refentrytitle>systemd.service</refentrytitle><manvolnum>5</manvolnum></citerefentry>,
|
||||||
<citerefentry><refentrytitle>systemd.device</refentrytitle><manvolnum>5</manvolnum></citerefentry>,
|
<citerefentry><refentrytitle>systemd.device</refentrytitle><manvolnum>5</manvolnum></citerefentry>,
|
||||||
<citerefentry><refentrytitle>mount</refentrytitle><manvolnum>8</manvolnum></citerefentry>,
|
<citerefentry><refentrytitle>mount</refentrytitle><manvolnum>8</manvolnum></citerefentry>,
|
||||||
|
|
|
@ -72,7 +72,10 @@
|
||||||
<para>Additional options are listed in
|
<para>Additional options are listed in
|
||||||
<citerefentry><refentrytitle>systemd.exec</refentrytitle><manvolnum>5</manvolnum></citerefentry>,
|
<citerefentry><refentrytitle>systemd.exec</refentrytitle><manvolnum>5</manvolnum></citerefentry>,
|
||||||
which define the execution environment the commands
|
which define the execution environment the commands
|
||||||
are executed in.</para>
|
are executed in, and in
|
||||||
|
<citerefentry><refentrytitle>systemd.kill</refentrytitle><manvolnum>5</manvolnum></citerefentry>
|
||||||
|
which define the way the processes of the service are
|
||||||
|
terminated.</para>
|
||||||
|
|
||||||
<para>Unless <varname>DefaultDependencies=</varname>
|
<para>Unless <varname>DefaultDependencies=</varname>
|
||||||
is set to <option>false</option>, service units will
|
is set to <option>false</option>, service units will
|
||||||
|
@ -112,7 +115,9 @@
|
||||||
supervises. A number of options that may be used in
|
supervises. A number of options that may be used in
|
||||||
this section are shared with other unit types. These
|
this section are shared with other unit types. These
|
||||||
options are documented in
|
options are documented in
|
||||||
<citerefentry><refentrytitle>systemd.exec</refentrytitle><manvolnum>5</manvolnum></citerefentry>. The
|
<citerefentry><refentrytitle>systemd.exec</refentrytitle><manvolnum>5</manvolnum></citerefentry>
|
||||||
|
and
|
||||||
|
<citerefentry><refentrytitle>systemd.kill</refentrytitle><manvolnum>5</manvolnum></citerefentry>. The
|
||||||
options specific to the <literal>[Service]</literal>
|
options specific to the <literal>[Service]</literal>
|
||||||
section of service units are the following:</para>
|
section of service units are the following:</para>
|
||||||
|
|
||||||
|
@ -417,12 +422,13 @@
|
||||||
configured in this option are run are
|
configured in this option are run are
|
||||||
terminated according to the
|
terminated according to the
|
||||||
<varname>KillMode=</varname> setting
|
<varname>KillMode=</varname> setting
|
||||||
(see below). If this option is not
|
(see
|
||||||
specified the process is terminated
|
<citerefentry><refentrytitle>systemd.kill</refentrytitle><manvolnum>5</manvolnum></citerefentry>). If
|
||||||
right-away when service stop is
|
this option is not specified the
|
||||||
requested. Specifier and environment
|
process is terminated right-away when
|
||||||
variable substitution is supported
|
service stop is requested. Specifier
|
||||||
(including
|
and environment variable substitution
|
||||||
|
is supported (including
|
||||||
<literal>$MAINPID</literal>, see
|
<literal>$MAINPID</literal>, see
|
||||||
above).</para></listitem>
|
above).</para></listitem>
|
||||||
</varlistentry>
|
</varlistentry>
|
||||||
|
@ -471,7 +477,7 @@
|
||||||
another delay of this time with
|
another delay of this time with
|
||||||
SIGKILL. (See
|
SIGKILL. (See
|
||||||
<varname>KillMode=</varname>
|
<varname>KillMode=</varname>
|
||||||
below.) Takes a unit-less value in seconds, or a
|
in <citerefentry><refentrytitle>systemd.kill</refentrytitle><manvolnum>5</manvolnum></citerefentry>) Takes a unit-less value in seconds, or a
|
||||||
time span value such as "5min
|
time span value such as "5min
|
||||||
20s". Pass 0 to disable the timeout
|
20s". Pass 0 to disable the timeout
|
||||||
logic. Defaults to
|
logic. Defaults to
|
||||||
|
@ -598,72 +604,6 @@
|
||||||
false.</para></listitem>
|
false.</para></listitem>
|
||||||
</varlistentry>
|
</varlistentry>
|
||||||
|
|
||||||
<varlistentry>
|
|
||||||
<term><varname>KillMode=</varname></term>
|
|
||||||
<listitem><para>Specifies how
|
|
||||||
processes of this service shall be
|
|
||||||
killed. One of
|
|
||||||
<option>control-group</option>,
|
|
||||||
<option>process</option>,
|
|
||||||
<option>none</option>.</para>
|
|
||||||
|
|
||||||
<para>If set to
|
|
||||||
<option>control-group</option> all
|
|
||||||
remaining processes in the control
|
|
||||||
group of this service will be
|
|
||||||
terminated on service stop, after the
|
|
||||||
stop command (as configured with
|
|
||||||
<varname>ExecStop=</varname>) is
|
|
||||||
executed. If set to
|
|
||||||
<option>process</option> only the main
|
|
||||||
process itself is killed. If set to
|
|
||||||
<option>none</option> no process is
|
|
||||||
killed. In this case only the stop
|
|
||||||
command will be executed on service
|
|
||||||
stop, but no process be killed
|
|
||||||
otherwise. Processes remaining alive
|
|
||||||
after stop are left in their control
|
|
||||||
group and the control group continues
|
|
||||||
to exist after stop unless it is
|
|
||||||
empty. Defaults to
|
|
||||||
<option>control-group</option>.</para>
|
|
||||||
|
|
||||||
<para>Processes will first be
|
|
||||||
terminated via SIGTERM (unless the
|
|
||||||
signal to send is changed via
|
|
||||||
<varname>KillSignal=</varname>). If
|
|
||||||
then after a delay (configured via the
|
|
||||||
<varname>TimeoutSec=</varname> option)
|
|
||||||
processes still remain, the
|
|
||||||
termination request is repeated with
|
|
||||||
the SIGKILL signal (unless this is
|
|
||||||
disabled via the
|
|
||||||
<varname>SendSIGKILL=</varname>
|
|
||||||
option). See
|
|
||||||
<citerefentry><refentrytitle>kill</refentrytitle><manvolnum>2</manvolnum></citerefentry>
|
|
||||||
for more
|
|
||||||
information.</para></listitem>
|
|
||||||
</varlistentry>
|
|
||||||
|
|
||||||
<varlistentry>
|
|
||||||
<term><varname>KillSignal=</varname></term>
|
|
||||||
<listitem><para>Specifies which signal
|
|
||||||
to use when killing a
|
|
||||||
service. Defaults to SIGTERM.
|
|
||||||
</para></listitem>
|
|
||||||
</varlistentry>
|
|
||||||
|
|
||||||
<varlistentry>
|
|
||||||
<term><varname>SendSIGKILL=</varname></term>
|
|
||||||
<listitem><para>Specifies whether to
|
|
||||||
send SIGKILL to remaining processes
|
|
||||||
after a timeout, if the normal
|
|
||||||
shutdown procedure left processes of
|
|
||||||
the service around. Takes a boolean
|
|
||||||
value. Defaults to "yes".
|
|
||||||
</para></listitem>
|
|
||||||
</varlistentry>
|
|
||||||
|
|
||||||
<varlistentry>
|
<varlistentry>
|
||||||
<term><varname>NonBlocking=</varname></term>
|
<term><varname>NonBlocking=</varname></term>
|
||||||
<listitem><para>Set O_NONBLOCK flag
|
<listitem><para>Set O_NONBLOCK flag
|
||||||
|
@ -818,6 +758,13 @@
|
||||||
</varlistentry>
|
</varlistentry>
|
||||||
|
|
||||||
</variablelist>
|
</variablelist>
|
||||||
|
|
||||||
|
<para>Check
|
||||||
|
<citerefentry><refentrytitle>systemd.exec</refentrytitle><manvolnum>5</manvolnum></citerefentry>
|
||||||
|
and
|
||||||
|
<citerefentry><refentrytitle>systemd.kill</refentrytitle><manvolnum>5</manvolnum></citerefentry>
|
||||||
|
for more settings.</para>
|
||||||
|
|
||||||
</refsect1>
|
</refsect1>
|
||||||
|
|
||||||
<refsect1>
|
<refsect1>
|
||||||
|
@ -888,7 +835,8 @@
|
||||||
<citerefentry><refentrytitle>systemd</refentrytitle><manvolnum>1</manvolnum></citerefentry>,
|
<citerefentry><refentrytitle>systemd</refentrytitle><manvolnum>1</manvolnum></citerefentry>,
|
||||||
<citerefentry><refentrytitle>systemctl</refentrytitle><manvolnum>8</manvolnum></citerefentry>,
|
<citerefentry><refentrytitle>systemctl</refentrytitle><manvolnum>8</manvolnum></citerefentry>,
|
||||||
<citerefentry><refentrytitle>systemd.unit</refentrytitle><manvolnum>5</manvolnum></citerefentry>,
|
<citerefentry><refentrytitle>systemd.unit</refentrytitle><manvolnum>5</manvolnum></citerefentry>,
|
||||||
<citerefentry><refentrytitle>systemd.exec</refentrytitle><manvolnum>5</manvolnum></citerefentry>
|
<citerefentry><refentrytitle>systemd.exec</refentrytitle><manvolnum>5</manvolnum></citerefentry>,
|
||||||
|
<citerefentry><refentrytitle>systemd.kill</refentrytitle><manvolnum>5</manvolnum></citerefentry>
|
||||||
</para>
|
</para>
|
||||||
</refsect1>
|
</refsect1>
|
||||||
|
|
||||||
|
|
|
@ -76,7 +76,10 @@
|
||||||
<option>ExecStartPost=</option>,
|
<option>ExecStartPost=</option>,
|
||||||
<option>ExecStopPre=</option> and
|
<option>ExecStopPre=</option> and
|
||||||
<option>ExecStoptPost=</option> commands are executed
|
<option>ExecStoptPost=</option> commands are executed
|
||||||
in.</para>
|
in, and in
|
||||||
|
<citerefentry><refentrytitle>systemd.kill</refentrytitle><manvolnum>5</manvolnum></citerefentry>
|
||||||
|
which define the way the processes are
|
||||||
|
terminated.</para>
|
||||||
|
|
||||||
<para>For each socket file a matching service file
|
<para>For each socket file a matching service file
|
||||||
(see
|
(see
|
||||||
|
@ -134,7 +137,9 @@
|
||||||
supervises. A number of options that may be used in
|
supervises. A number of options that may be used in
|
||||||
this section are shared with other unit types. These
|
this section are shared with other unit types. These
|
||||||
options are documented in
|
options are documented in
|
||||||
<citerefentry><refentrytitle>systemd.exec</refentrytitle><manvolnum>5</manvolnum></citerefentry>. The
|
<citerefentry><refentrytitle>systemd.exec</refentrytitle><manvolnum>5</manvolnum></citerefentry>
|
||||||
|
and
|
||||||
|
<citerefentry><refentrytitle>systemd.kill</refentrytitle><manvolnum>5</manvolnum></citerefentry>. The
|
||||||
options specific to the [Socket] section of socket
|
options specific to the [Socket] section of socket
|
||||||
units are the following:</para>
|
units are the following:</para>
|
||||||
|
|
||||||
|
@ -603,7 +608,7 @@
|
||||||
will be terminated forcibly via
|
will be terminated forcibly via
|
||||||
SIGTERM, and after another delay of
|
SIGTERM, and after another delay of
|
||||||
this time with SIGKILL. (See
|
this time with SIGKILL. (See
|
||||||
<option>KillMode=</option> below.)
|
<option>KillMode=</option> in <citerefentry><refentrytitle>systemd.kill</refentrytitle><manvolnum>5</manvolnum></citerefentry>.)
|
||||||
Takes a unit-less value in seconds, or
|
Takes a unit-less value in seconds, or
|
||||||
a time span value such as "5min
|
a time span value such as "5min
|
||||||
20s". Pass 0 to disable the timeout
|
20s". Pass 0 to disable the timeout
|
||||||
|
@ -611,41 +616,6 @@
|
||||||
90s.</para></listitem>
|
90s.</para></listitem>
|
||||||
</varlistentry>
|
</varlistentry>
|
||||||
|
|
||||||
<varlistentry>
|
|
||||||
<term><varname>KillMode=</varname></term>
|
|
||||||
<listitem><para>Specifies how
|
|
||||||
processes of this socket unit shall be
|
|
||||||
killed. One of
|
|
||||||
<option>control-group</option>,
|
|
||||||
<option>process</option>,
|
|
||||||
<option>none</option>.</para>
|
|
||||||
|
|
||||||
<para>This option is mostly equivalent
|
|
||||||
to the <option>KillMode=</option>
|
|
||||||
option of service files. See
|
|
||||||
<citerefentry><refentrytitle>systemd.service</refentrytitle><manvolnum>5</manvolnum></citerefentry>
|
|
||||||
for details.</para></listitem>
|
|
||||||
</varlistentry>
|
|
||||||
|
|
||||||
<varlistentry>
|
|
||||||
<term><varname>KillSignal=</varname></term>
|
|
||||||
<listitem><para>Specifies which signal
|
|
||||||
to use when killing a process of this
|
|
||||||
socket. Defaults to SIGTERM.
|
|
||||||
</para></listitem>
|
|
||||||
</varlistentry>
|
|
||||||
|
|
||||||
<varlistentry>
|
|
||||||
<term><varname>SendSIGKILL=</varname></term>
|
|
||||||
<listitem><para>Specifies whether to
|
|
||||||
send SIGKILL to remaining processes
|
|
||||||
after a timeout, if the normal
|
|
||||||
shutdown procedure left processes of
|
|
||||||
the socket around. Takes a boolean
|
|
||||||
value. Defaults to "yes".
|
|
||||||
</para></listitem>
|
|
||||||
</varlistentry>
|
|
||||||
|
|
||||||
<varlistentry>
|
<varlistentry>
|
||||||
<term><varname>Service=</varname></term>
|
<term><varname>Service=</varname></term>
|
||||||
<listitem><para>Specifies the service
|
<listitem><para>Specifies the service
|
||||||
|
@ -658,6 +628,13 @@
|
||||||
</varlistentry>
|
</varlistentry>
|
||||||
|
|
||||||
</variablelist>
|
</variablelist>
|
||||||
|
|
||||||
|
<para>Check
|
||||||
|
<citerefentry><refentrytitle>systemd.exec</refentrytitle><manvolnum>5</manvolnum></citerefentry>
|
||||||
|
and
|
||||||
|
<citerefentry><refentrytitle>systemd.kill</refentrytitle><manvolnum>5</manvolnum></citerefentry>
|
||||||
|
for more settings.</para>
|
||||||
|
|
||||||
</refsect1>
|
</refsect1>
|
||||||
|
|
||||||
<refsect1>
|
<refsect1>
|
||||||
|
@ -667,6 +644,7 @@
|
||||||
<citerefentry><refentrytitle>systemctl</refentrytitle><manvolnum>8</manvolnum></citerefentry>,
|
<citerefentry><refentrytitle>systemctl</refentrytitle><manvolnum>8</manvolnum></citerefentry>,
|
||||||
<citerefentry><refentrytitle>systemd.unit</refentrytitle><manvolnum>5</manvolnum></citerefentry>,
|
<citerefentry><refentrytitle>systemd.unit</refentrytitle><manvolnum>5</manvolnum></citerefentry>,
|
||||||
<citerefentry><refentrytitle>systemd.exec</refentrytitle><manvolnum>5</manvolnum></citerefentry>,
|
<citerefentry><refentrytitle>systemd.exec</refentrytitle><manvolnum>5</manvolnum></citerefentry>,
|
||||||
|
<citerefentry><refentrytitle>systemd.kill</refentrytitle><manvolnum>5</manvolnum></citerefentry>,
|
||||||
<citerefentry><refentrytitle>systemd.service</refentrytitle><manvolnum>5</manvolnum></citerefentry>
|
<citerefentry><refentrytitle>systemd.service</refentrytitle><manvolnum>5</manvolnum></citerefentry>
|
||||||
</para>
|
</para>
|
||||||
</refsect1>
|
</refsect1>
|
||||||
|
|
|
@ -68,6 +68,15 @@
|
||||||
specific configuration options are configured in the
|
specific configuration options are configured in the
|
||||||
[Swap] section.</para>
|
[Swap] section.</para>
|
||||||
|
|
||||||
|
<para>Additional options are listed in
|
||||||
|
<citerefentry><refentrytitle>systemd.exec</refentrytitle><manvolnum>5</manvolnum></citerefentry>,
|
||||||
|
which define the execution environment the
|
||||||
|
<citerefentry><refentrytitle>swapon</refentrytitle><manvolnum>8</manvolnum></citerefentry>
|
||||||
|
binary is executed in, and in
|
||||||
|
<citerefentry><refentrytitle>systemd.kill</refentrytitle><manvolnum>5</manvolnum></citerefentry>
|
||||||
|
which define the way the processes are
|
||||||
|
terminated.</para>
|
||||||
|
|
||||||
<para>Swap units must be named after the devices
|
<para>Swap units must be named after the devices
|
||||||
(resp. files) they control. Example: the swap device
|
(resp. files) they control. Example: the swap device
|
||||||
<filename>/dev/sda5</filename> must be configured in a
|
<filename>/dev/sda5</filename> must be configured in a
|
||||||
|
@ -121,7 +130,9 @@
|
||||||
supervises. A number of options that may be used in
|
supervises. A number of options that may be used in
|
||||||
this section are shared with other unit types. These
|
this section are shared with other unit types. These
|
||||||
options are documented in
|
options are documented in
|
||||||
<citerefentry><refentrytitle>systemd.exec</refentrytitle><manvolnum>5</manvolnum></citerefentry>. The
|
<citerefentry><refentrytitle>systemd.exec</refentrytitle><manvolnum>5</manvolnum></citerefentry>
|
||||||
|
and
|
||||||
|
<citerefentry><refentrytitle>systemd.kill</refentrytitle><manvolnum>5</manvolnum></citerefentry>. The
|
||||||
options specific to the [Swap] section of swap units
|
options specific to the [Swap] section of swap units
|
||||||
are the following:</para>
|
are the following:</para>
|
||||||
|
|
||||||
|
@ -167,49 +178,21 @@
|
||||||
will be terminated forcibly via
|
will be terminated forcibly via
|
||||||
SIGTERM, and after another delay of
|
SIGTERM, and after another delay of
|
||||||
this time with SIGKILL. (See
|
this time with SIGKILL. (See
|
||||||
<option>KillMode=</option> below.)
|
<option>KillMode=</option> in
|
||||||
|
<citerefentry><refentrytitle>systemd.kill</refentrytitle><manvolnum>5</manvolnum></citerefentry>.)
|
||||||
Takes a unit-less value in seconds, or
|
Takes a unit-less value in seconds, or
|
||||||
a time span value such as "5min
|
a time span value such as "5min
|
||||||
20s". Pass 0 to disable the timeout
|
20s". Pass 0 to disable the timeout
|
||||||
logic. Defaults to
|
logic. Defaults to
|
||||||
90s.</para></listitem>
|
90s.</para></listitem>
|
||||||
</varlistentry>
|
</varlistentry>
|
||||||
|
|
||||||
<varlistentry>
|
|
||||||
<term><varname>KillMode=</varname></term>
|
|
||||||
<listitem><para>Specifies how
|
|
||||||
processes of this swap shall be
|
|
||||||
killed. One of
|
|
||||||
<option>control-group</option>,
|
|
||||||
<option>process</option>,
|
|
||||||
<option>none</option>.</para>
|
|
||||||
|
|
||||||
<para>This option is mostly equivalent
|
|
||||||
to the <option>KillMode=</option>
|
|
||||||
option of service files. See
|
|
||||||
<citerefentry><refentrytitle>systemd.service</refentrytitle><manvolnum>5</manvolnum></citerefentry>
|
|
||||||
for details.</para></listitem>
|
|
||||||
</varlistentry>
|
|
||||||
|
|
||||||
<varlistentry>
|
|
||||||
<term><varname>KillSignal=</varname></term>
|
|
||||||
<listitem><para>Specifies which signal
|
|
||||||
to use when killing a process of this
|
|
||||||
swap. Defaults to SIGTERM.
|
|
||||||
</para></listitem>
|
|
||||||
</varlistentry>
|
|
||||||
|
|
||||||
<varlistentry>
|
|
||||||
<term><varname>SendSIGKILL=</varname></term>
|
|
||||||
<listitem><para>Specifies whether to
|
|
||||||
send SIGKILL to remaining processes
|
|
||||||
after a timeout, if the normal
|
|
||||||
shutdown procedure left processes of
|
|
||||||
the swap around. Takes a boolean
|
|
||||||
value. Defaults to "yes".
|
|
||||||
</para></listitem>
|
|
||||||
</varlistentry>
|
|
||||||
</variablelist>
|
</variablelist>
|
||||||
|
|
||||||
|
<para>Check
|
||||||
|
<citerefentry><refentrytitle>systemd.exec</refentrytitle><manvolnum>5</manvolnum></citerefentry>
|
||||||
|
and
|
||||||
|
<citerefentry><refentrytitle>systemd.kill</refentrytitle><manvolnum>5</manvolnum></citerefentry>
|
||||||
|
for more settings.</para>
|
||||||
</refsect1>
|
</refsect1>
|
||||||
|
|
||||||
<refsect1>
|
<refsect1>
|
||||||
|
@ -219,6 +202,7 @@
|
||||||
<citerefentry><refentrytitle>systemctl</refentrytitle><manvolnum>8</manvolnum></citerefentry>,
|
<citerefentry><refentrytitle>systemctl</refentrytitle><manvolnum>8</manvolnum></citerefentry>,
|
||||||
<citerefentry><refentrytitle>systemd.unit</refentrytitle><manvolnum>5</manvolnum></citerefentry>,
|
<citerefentry><refentrytitle>systemd.unit</refentrytitle><manvolnum>5</manvolnum></citerefentry>,
|
||||||
<citerefentry><refentrytitle>systemd.exec</refentrytitle><manvolnum>5</manvolnum></citerefentry>,
|
<citerefentry><refentrytitle>systemd.exec</refentrytitle><manvolnum>5</manvolnum></citerefentry>,
|
||||||
|
<citerefentry><refentrytitle>systemd.kill</refentrytitle><manvolnum>5</manvolnum></citerefentry>,
|
||||||
<citerefentry><refentrytitle>systemd.device</refentrytitle><manvolnum>5</manvolnum></citerefentry>,
|
<citerefentry><refentrytitle>systemd.device</refentrytitle><manvolnum>5</manvolnum></citerefentry>,
|
||||||
<citerefentry><refentrytitle>systemd.mount</refentrytitle><manvolnum>5</manvolnum></citerefentry>,
|
<citerefentry><refentrytitle>systemd.mount</refentrytitle><manvolnum>5</manvolnum></citerefentry>,
|
||||||
<citerefentry><refentrytitle>swapon</refentrytitle><manvolnum>8</manvolnum></citerefentry>,
|
<citerefentry><refentrytitle>swapon</refentrytitle><manvolnum>8</manvolnum></citerefentry>,
|
||||||
|
|
|
@ -30,8 +30,6 @@
|
||||||
#include "dbus-common.h"
|
#include "dbus-common.h"
|
||||||
#include "syscall-list.h"
|
#include "syscall-list.h"
|
||||||
|
|
||||||
DEFINE_BUS_PROPERTY_APPEND_ENUM(bus_execute_append_kill_mode, kill_mode, KillMode);
|
|
||||||
|
|
||||||
DEFINE_BUS_PROPERTY_APPEND_ENUM(bus_execute_append_input, exec_input, ExecInput);
|
DEFINE_BUS_PROPERTY_APPEND_ENUM(bus_execute_append_input, exec_input, ExecInput);
|
||||||
DEFINE_BUS_PROPERTY_APPEND_ENUM(bus_execute_append_output, exec_output, ExecOutput);
|
DEFINE_BUS_PROPERTY_APPEND_ENUM(bus_execute_append_output, exec_output, ExecOutput);
|
||||||
|
|
||||||
|
@ -431,8 +429,6 @@ const BusProperty bus_exec_context_properties[] = {
|
||||||
{ "PrivateTmp", bus_property_append_bool, "b", offsetof(ExecContext, private_tmp) },
|
{ "PrivateTmp", bus_property_append_bool, "b", offsetof(ExecContext, private_tmp) },
|
||||||
{ "PrivateNetwork", bus_property_append_bool, "b", offsetof(ExecContext, private_network) },
|
{ "PrivateNetwork", bus_property_append_bool, "b", offsetof(ExecContext, private_network) },
|
||||||
{ "SameProcessGroup", bus_property_append_bool, "b", offsetof(ExecContext, same_pgrp) },
|
{ "SameProcessGroup", bus_property_append_bool, "b", offsetof(ExecContext, same_pgrp) },
|
||||||
{ "KillMode", bus_execute_append_kill_mode, "s", offsetof(ExecContext, kill_mode) },
|
|
||||||
{ "KillSignal", bus_property_append_int, "i", offsetof(ExecContext, kill_signal) },
|
|
||||||
{ "UtmpIdentifier", bus_property_append_string, "s", offsetof(ExecContext, utmp_id), true },
|
{ "UtmpIdentifier", bus_property_append_string, "s", offsetof(ExecContext, utmp_id), true },
|
||||||
{ "ControlGroupModify", bus_property_append_bool, "b", offsetof(ExecContext, control_group_modify) },
|
{ "ControlGroupModify", bus_property_append_bool, "b", offsetof(ExecContext, control_group_modify) },
|
||||||
{ "ControlGroupPersistent", bus_property_append_tristate_false, "b", offsetof(ExecContext, control_group_persistent) },
|
{ "ControlGroupPersistent", bus_property_append_tristate_false, "b", offsetof(ExecContext, control_group_persistent) },
|
||||||
|
|
|
@ -120,6 +120,5 @@ int bus_execute_append_capabilities(DBusMessageIter *i, const char *property, vo
|
||||||
int bus_execute_append_capability_bs(DBusMessageIter *i, const char *property, void *data);
|
int bus_execute_append_capability_bs(DBusMessageIter *i, const char *property, void *data);
|
||||||
int bus_execute_append_rlimits(DBusMessageIter *i, const char *property, void *data);
|
int bus_execute_append_rlimits(DBusMessageIter *i, const char *property, void *data);
|
||||||
int bus_execute_append_command(DBusMessageIter *u, const char *property, void *data);
|
int bus_execute_append_command(DBusMessageIter *u, const char *property, void *data);
|
||||||
int bus_execute_append_kill_mode(DBusMessageIter *i, const char *property, void *data);
|
|
||||||
int bus_execute_append_env_files(DBusMessageIter *i, const char *property, void *data);
|
int bus_execute_append_env_files(DBusMessageIter *i, const char *property, void *data);
|
||||||
int bus_execute_append_syscall_filter(DBusMessageIter *i, const char *property, void *data);
|
int bus_execute_append_syscall_filter(DBusMessageIter *i, const char *property, void *data);
|
||||||
|
|
|
@ -0,0 +1,35 @@
|
||||||
|
/*-*- Mode: C; c-basic-offset: 8; indent-tabs-mode: nil -*-*/
|
||||||
|
|
||||||
|
/***
|
||||||
|
This file is part of systemd.
|
||||||
|
|
||||||
|
Copyright 2012 Lennart Poettering
|
||||||
|
|
||||||
|
systemd is free software; you can redistribute it and/or modify it
|
||||||
|
under the terms of the GNU Lesser General Public License as published by
|
||||||
|
the Free Software Foundation; either version 2.1 of the License, or
|
||||||
|
(at your option) any later version.
|
||||||
|
|
||||||
|
systemd is distributed in the hope that it will be useful, but
|
||||||
|
WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||||
|
Lesser General Public License for more details.
|
||||||
|
|
||||||
|
You should have received a copy of the GNU Lesser General Public License
|
||||||
|
along with systemd; If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
***/
|
||||||
|
|
||||||
|
#include <errno.h>
|
||||||
|
#include <dbus/dbus.h>
|
||||||
|
|
||||||
|
#include "dbus-kill.h"
|
||||||
|
#include "dbus-common.h"
|
||||||
|
|
||||||
|
DEFINE_BUS_PROPERTY_APPEND_ENUM(bus_kill_append_mode, kill_mode, KillMode);
|
||||||
|
|
||||||
|
const BusProperty bus_kill_context_properties[] = {
|
||||||
|
{ "KillMode", bus_kill_append_mode, "s", offsetof(KillContext, kill_mode) },
|
||||||
|
{ "KillSignal", bus_property_append_int, "i", offsetof(KillContext, kill_signal) },
|
||||||
|
{ "SendSIGKILL", bus_property_append_bool, "b", offsetof(KillContext, send_sigkill) },
|
||||||
|
{ NULL, }
|
||||||
|
};
|
|
@ -0,0 +1,39 @@
|
||||||
|
/*-*- Mode: C; c-basic-offset: 8; indent-tabs-mode: nil -*-*/
|
||||||
|
|
||||||
|
#pragma once
|
||||||
|
|
||||||
|
/***
|
||||||
|
This file is part of systemd.
|
||||||
|
|
||||||
|
Copyright 2012 Lennart Poettering
|
||||||
|
|
||||||
|
systemd is free software; you can redistribute it and/or modify it
|
||||||
|
under the terms of the GNU Lesser General Public License as published by
|
||||||
|
the Free Software Foundation; either version 2.1 of the License, or
|
||||||
|
(at your option) any later version.
|
||||||
|
|
||||||
|
systemd is distributed in the hope that it will be useful, but
|
||||||
|
WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||||
|
Lesser General Public License for more details.
|
||||||
|
|
||||||
|
You should have received a copy of the GNU Lesser General Public License
|
||||||
|
along with systemd; If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
***/
|
||||||
|
|
||||||
|
#include <dbus/dbus.h>
|
||||||
|
|
||||||
|
#include "manager.h"
|
||||||
|
#include "dbus-common.h"
|
||||||
|
|
||||||
|
#define BUS_KILL_CONTEXT_INTERFACE \
|
||||||
|
" <property name=\"KillMode\" type=\"s\" access=\"read\"/>\n" \
|
||||||
|
" <property name=\"KillSignal\" type=\"i\" access=\"read\"/>\n" \
|
||||||
|
" <property name=\"SendSIGKILL\" type=\"b\" access=\"read\"/>\n"
|
||||||
|
|
||||||
|
#define BUS_KILL_COMMAND_INTERFACE(name) \
|
||||||
|
" <property name=\"" name "\" type=\"a(sasbttuii)\" access=\"read\"/>\n"
|
||||||
|
|
||||||
|
extern const BusProperty bus_kill_context_properties[];
|
||||||
|
|
||||||
|
int bus_kill_append_mode(DBusMessageIter *i, const char *property, void *data);
|
|
@ -23,6 +23,7 @@
|
||||||
|
|
||||||
#include "dbus-unit.h"
|
#include "dbus-unit.h"
|
||||||
#include "dbus-mount.h"
|
#include "dbus-mount.h"
|
||||||
|
#include "dbus-kill.h"
|
||||||
#include "dbus-execute.h"
|
#include "dbus-execute.h"
|
||||||
#include "dbus-common.h"
|
#include "dbus-common.h"
|
||||||
|
|
||||||
|
@ -37,6 +38,7 @@
|
||||||
BUS_EXEC_COMMAND_INTERFACE("ExecUnmount") \
|
BUS_EXEC_COMMAND_INTERFACE("ExecUnmount") \
|
||||||
BUS_EXEC_COMMAND_INTERFACE("ExecRemount") \
|
BUS_EXEC_COMMAND_INTERFACE("ExecRemount") \
|
||||||
BUS_EXEC_CONTEXT_INTERFACE \
|
BUS_EXEC_CONTEXT_INTERFACE \
|
||||||
|
BUS_KILL_CONTEXT_INTERFACE \
|
||||||
" <property name=\"ControlPID\" type=\"u\" access=\"read\"/>\n" \
|
" <property name=\"ControlPID\" type=\"u\" access=\"read\"/>\n" \
|
||||||
" <property name=\"DirectoryMode\" type=\"u\" access=\"read\"/>\n" \
|
" <property name=\"DirectoryMode\" type=\"u\" access=\"read\"/>\n" \
|
||||||
" <property name=\"Result\" type=\"s\" access=\"read\"/>\n" \
|
" <property name=\"Result\" type=\"s\" access=\"read\"/>\n" \
|
||||||
|
@ -155,6 +157,7 @@ DBusHandlerResult bus_mount_message_handler(Unit *u, DBusConnection *c, DBusMess
|
||||||
{ "org.freedesktop.systemd1.Unit", bus_unit_properties, u },
|
{ "org.freedesktop.systemd1.Unit", bus_unit_properties, u },
|
||||||
{ "org.freedesktop.systemd1.Mount", bus_mount_properties, m },
|
{ "org.freedesktop.systemd1.Mount", bus_mount_properties, m },
|
||||||
{ "org.freedesktop.systemd1.Mount", bus_exec_context_properties, &m->exec_context },
|
{ "org.freedesktop.systemd1.Mount", bus_exec_context_properties, &m->exec_context },
|
||||||
|
{ "org.freedesktop.systemd1.Mount", bus_kill_context_properties, &m->kill_context },
|
||||||
{ NULL, }
|
{ NULL, }
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
@ -23,6 +23,7 @@
|
||||||
|
|
||||||
#include "dbus-unit.h"
|
#include "dbus-unit.h"
|
||||||
#include "dbus-execute.h"
|
#include "dbus-execute.h"
|
||||||
|
#include "dbus-kill.h"
|
||||||
#include "dbus-service.h"
|
#include "dbus-service.h"
|
||||||
#include "dbus-common.h"
|
#include "dbus-common.h"
|
||||||
|
|
||||||
|
@ -47,6 +48,7 @@
|
||||||
BUS_EXEC_COMMAND_INTERFACE("ExecStop") \
|
BUS_EXEC_COMMAND_INTERFACE("ExecStop") \
|
||||||
BUS_EXEC_COMMAND_INTERFACE("ExecStopPost") \
|
BUS_EXEC_COMMAND_INTERFACE("ExecStopPost") \
|
||||||
BUS_EXEC_CONTEXT_INTERFACE \
|
BUS_EXEC_CONTEXT_INTERFACE \
|
||||||
|
BUS_KILL_CONTEXT_INTERFACE \
|
||||||
" <property name=\"PermissionsStartOnly\" type=\"b\" access=\"read\"/>\n" \
|
" <property name=\"PermissionsStartOnly\" type=\"b\" access=\"read\"/>\n" \
|
||||||
" <property name=\"RootDirectoryStartOnly\" type=\"b\" access=\"read\"/>\n" \
|
" <property name=\"RootDirectoryStartOnly\" type=\"b\" access=\"read\"/>\n" \
|
||||||
" <property name=\"RemainAfterExit\" type=\"b\" access=\"read\"/>\n" \
|
" <property name=\"RemainAfterExit\" type=\"b\" access=\"read\"/>\n" \
|
||||||
|
@ -140,10 +142,12 @@ static const BusProperty bus_service_properties[] = {
|
||||||
|
|
||||||
DBusHandlerResult bus_service_message_handler(Unit *u, DBusConnection *connection, DBusMessage *message) {
|
DBusHandlerResult bus_service_message_handler(Unit *u, DBusConnection *connection, DBusMessage *message) {
|
||||||
Service *s = SERVICE(u);
|
Service *s = SERVICE(u);
|
||||||
|
|
||||||
const BusBoundProperties bps[] = {
|
const BusBoundProperties bps[] = {
|
||||||
{ "org.freedesktop.systemd1.Unit", bus_unit_properties, u },
|
{ "org.freedesktop.systemd1.Unit", bus_unit_properties, u },
|
||||||
{ "org.freedesktop.systemd1.Service", bus_service_properties, s },
|
{ "org.freedesktop.systemd1.Service", bus_service_properties, s },
|
||||||
{ "org.freedesktop.systemd1.Service", bus_exec_context_properties, &s->exec_context },
|
{ "org.freedesktop.systemd1.Service", bus_exec_context_properties, &s->exec_context },
|
||||||
|
{ "org.freedesktop.systemd1.Service", bus_kill_context_properties, &s->kill_context },
|
||||||
{ "org.freedesktop.systemd1.Service", bus_exec_main_status_properties, &s->main_exec_status },
|
{ "org.freedesktop.systemd1.Service", bus_exec_main_status_properties, &s->main_exec_status },
|
||||||
{ NULL, }
|
{ NULL, }
|
||||||
};
|
};
|
||||||
|
|
|
@ -24,6 +24,7 @@
|
||||||
#include "dbus-unit.h"
|
#include "dbus-unit.h"
|
||||||
#include "dbus-socket.h"
|
#include "dbus-socket.h"
|
||||||
#include "dbus-execute.h"
|
#include "dbus-execute.h"
|
||||||
|
#include "dbus-kill.h"
|
||||||
#include "dbus-common.h"
|
#include "dbus-common.h"
|
||||||
|
|
||||||
#define BUS_SOCKET_INTERFACE \
|
#define BUS_SOCKET_INTERFACE \
|
||||||
|
@ -36,6 +37,7 @@
|
||||||
BUS_EXEC_COMMAND_INTERFACE("ExecStopPre") \
|
BUS_EXEC_COMMAND_INTERFACE("ExecStopPre") \
|
||||||
BUS_EXEC_COMMAND_INTERFACE("ExecStopPost") \
|
BUS_EXEC_COMMAND_INTERFACE("ExecStopPost") \
|
||||||
BUS_EXEC_CONTEXT_INTERFACE \
|
BUS_EXEC_CONTEXT_INTERFACE \
|
||||||
|
BUS_KILL_CONTEXT_INTERFACE \
|
||||||
" <property name=\"ControlPID\" type=\"u\" access=\"read\"/>\n" \
|
" <property name=\"ControlPID\" type=\"u\" access=\"read\"/>\n" \
|
||||||
" <property name=\"BindToDevice\" type=\"s\" access=\"read\"/>\n" \
|
" <property name=\"BindToDevice\" type=\"s\" access=\"read\"/>\n" \
|
||||||
" <property name=\"DirectoryMode\" type=\"u\" access=\"read\"/>\n" \
|
" <property name=\"DirectoryMode\" type=\"u\" access=\"read\"/>\n" \
|
||||||
|
@ -132,6 +134,7 @@ DBusHandlerResult bus_socket_message_handler(Unit *u, DBusConnection *c, DBusMes
|
||||||
{ "org.freedesktop.systemd1.Unit", bus_unit_properties, u },
|
{ "org.freedesktop.systemd1.Unit", bus_unit_properties, u },
|
||||||
{ "org.freedesktop.systemd1.Socket", bus_socket_properties, s },
|
{ "org.freedesktop.systemd1.Socket", bus_socket_properties, s },
|
||||||
{ "org.freedesktop.systemd1.Socket", bus_exec_context_properties, &s->exec_context },
|
{ "org.freedesktop.systemd1.Socket", bus_exec_context_properties, &s->exec_context },
|
||||||
|
{ "org.freedesktop.systemd1.Socket", bus_kill_context_properties, &s->kill_context },
|
||||||
{ NULL, }
|
{ NULL, }
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
@ -25,6 +25,7 @@
|
||||||
#include "dbus-unit.h"
|
#include "dbus-unit.h"
|
||||||
#include "dbus-swap.h"
|
#include "dbus-swap.h"
|
||||||
#include "dbus-execute.h"
|
#include "dbus-execute.h"
|
||||||
|
#include "dbus-kill.h"
|
||||||
#include "dbus-common.h"
|
#include "dbus-common.h"
|
||||||
|
|
||||||
#define BUS_SWAP_INTERFACE \
|
#define BUS_SWAP_INTERFACE \
|
||||||
|
@ -35,6 +36,7 @@
|
||||||
BUS_EXEC_COMMAND_INTERFACE("ExecActivate") \
|
BUS_EXEC_COMMAND_INTERFACE("ExecActivate") \
|
||||||
BUS_EXEC_COMMAND_INTERFACE("ExecDeactivate") \
|
BUS_EXEC_COMMAND_INTERFACE("ExecDeactivate") \
|
||||||
BUS_EXEC_CONTEXT_INTERFACE \
|
BUS_EXEC_CONTEXT_INTERFACE \
|
||||||
|
BUS_KILL_CONTEXT_INTERFACE \
|
||||||
" <property name=\"ControlPID\" type=\"u\" access=\"read\"/>\n" \
|
" <property name=\"ControlPID\" type=\"u\" access=\"read\"/>\n" \
|
||||||
" <property name=\"Result\" type=\"s\" access=\"read\"/>\n" \
|
" <property name=\"Result\" type=\"s\" access=\"read\"/>\n" \
|
||||||
" </interface>\n"
|
" </interface>\n"
|
||||||
|
@ -102,6 +104,7 @@ DBusHandlerResult bus_swap_message_handler(Unit *u, DBusConnection *c, DBusMessa
|
||||||
{ "org.freedesktop.systemd1.Unit", bus_unit_properties, u },
|
{ "org.freedesktop.systemd1.Unit", bus_unit_properties, u },
|
||||||
{ "org.freedesktop.systemd1.Swap", bus_swap_properties, s },
|
{ "org.freedesktop.systemd1.Swap", bus_swap_properties, s },
|
||||||
{ "org.freedesktop.systemd1.Swap", bus_exec_context_properties, &s->exec_context },
|
{ "org.freedesktop.systemd1.Swap", bus_exec_context_properties, &s->exec_context },
|
||||||
|
{ "org.freedesktop.systemd1.Swap", bus_kill_context_properties, &s->kill_context },
|
||||||
{ NULL, }
|
{ NULL, }
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
@ -1541,8 +1541,6 @@ void exec_context_init(ExecContext *c) {
|
||||||
c->syslog_priority = LOG_DAEMON|LOG_INFO;
|
c->syslog_priority = LOG_DAEMON|LOG_INFO;
|
||||||
c->syslog_level_prefix = true;
|
c->syslog_level_prefix = true;
|
||||||
c->mount_flags = MS_SHARED;
|
c->mount_flags = MS_SHARED;
|
||||||
c->kill_signal = SIGTERM;
|
|
||||||
c->send_sigkill = true;
|
|
||||||
c->control_group_persistent = -1;
|
c->control_group_persistent = -1;
|
||||||
c->ignore_sigpipe = true;
|
c->ignore_sigpipe = true;
|
||||||
c->timer_slack_nsec = (nsec_t) -1;
|
c->timer_slack_nsec = (nsec_t) -1;
|
||||||
|
@ -1735,7 +1733,8 @@ void exec_context_dump(ExecContext *c, FILE* f, const char *prefix) {
|
||||||
"%sPrivateTmp: %s\n"
|
"%sPrivateTmp: %s\n"
|
||||||
"%sControlGroupModify: %s\n"
|
"%sControlGroupModify: %s\n"
|
||||||
"%sControlGroupPersistent: %s\n"
|
"%sControlGroupPersistent: %s\n"
|
||||||
"%sPrivateNetwork: %s\n",
|
"%sPrivateNetwork: %s\n"
|
||||||
|
"%sIgnoreSIGPIPE: %s\n",
|
||||||
prefix, c->umask,
|
prefix, c->umask,
|
||||||
prefix, c->working_directory ? c->working_directory : "/",
|
prefix, c->working_directory ? c->working_directory : "/",
|
||||||
prefix, c->root_directory ? c->root_directory : "/",
|
prefix, c->root_directory ? c->root_directory : "/",
|
||||||
|
@ -1743,7 +1742,8 @@ void exec_context_dump(ExecContext *c, FILE* f, const char *prefix) {
|
||||||
prefix, yes_no(c->private_tmp),
|
prefix, yes_no(c->private_tmp),
|
||||||
prefix, yes_no(c->control_group_modify),
|
prefix, yes_no(c->control_group_modify),
|
||||||
prefix, yes_no(c->control_group_persistent),
|
prefix, yes_no(c->control_group_persistent),
|
||||||
prefix, yes_no(c->private_network));
|
prefix, yes_no(c->private_network),
|
||||||
|
prefix, yes_no(c->ignore_sigpipe));
|
||||||
|
|
||||||
STRV_FOREACH(e, c->environment)
|
STRV_FOREACH(e, c->environment)
|
||||||
fprintf(f, "%sEnvironment: %s\n", prefix, *e);
|
fprintf(f, "%sEnvironment: %s\n", prefix, *e);
|
||||||
|
@ -1894,16 +1894,6 @@ void exec_context_dump(ExecContext *c, FILE* f, const char *prefix) {
|
||||||
fputs("\n", f);
|
fputs("\n", f);
|
||||||
}
|
}
|
||||||
|
|
||||||
fprintf(f,
|
|
||||||
"%sKillMode: %s\n"
|
|
||||||
"%sKillSignal: SIG%s\n"
|
|
||||||
"%sSendSIGKILL: %s\n"
|
|
||||||
"%sIgnoreSIGPIPE: %s\n",
|
|
||||||
prefix, kill_mode_to_string(c->kill_mode),
|
|
||||||
prefix, signal_to_string(c->kill_signal),
|
|
||||||
prefix, yes_no(c->send_sigkill),
|
|
||||||
prefix, yes_no(c->ignore_sigpipe));
|
|
||||||
|
|
||||||
if (c->utmp_id)
|
if (c->utmp_id)
|
||||||
fprintf(f,
|
fprintf(f,
|
||||||
"%sUtmpIdentifier: %s\n",
|
"%sUtmpIdentifier: %s\n",
|
||||||
|
@ -2111,19 +2101,3 @@ static const char* const exec_output_table[_EXEC_OUTPUT_MAX] = {
|
||||||
};
|
};
|
||||||
|
|
||||||
DEFINE_STRING_TABLE_LOOKUP(exec_output, ExecOutput);
|
DEFINE_STRING_TABLE_LOOKUP(exec_output, ExecOutput);
|
||||||
|
|
||||||
static const char* const kill_mode_table[_KILL_MODE_MAX] = {
|
|
||||||
[KILL_CONTROL_GROUP] = "control-group",
|
|
||||||
[KILL_PROCESS] = "process",
|
|
||||||
[KILL_NONE] = "none"
|
|
||||||
};
|
|
||||||
|
|
||||||
DEFINE_STRING_TABLE_LOOKUP(kill_mode, KillMode);
|
|
||||||
|
|
||||||
static const char* const kill_who_table[_KILL_WHO_MAX] = {
|
|
||||||
[KILL_MAIN] = "main",
|
|
||||||
[KILL_CONTROL] = "control",
|
|
||||||
[KILL_ALL] = "all"
|
|
||||||
};
|
|
||||||
|
|
||||||
DEFINE_STRING_TABLE_LOOKUP(kill_who, KillWho);
|
|
||||||
|
|
|
@ -39,22 +39,6 @@ struct CGroupAttribute;
|
||||||
#include "list.h"
|
#include "list.h"
|
||||||
#include "util.h"
|
#include "util.h"
|
||||||
|
|
||||||
typedef enum KillMode {
|
|
||||||
KILL_CONTROL_GROUP = 0,
|
|
||||||
KILL_PROCESS,
|
|
||||||
KILL_NONE,
|
|
||||||
_KILL_MODE_MAX,
|
|
||||||
_KILL_MODE_INVALID = -1
|
|
||||||
} KillMode;
|
|
||||||
|
|
||||||
typedef enum KillWho {
|
|
||||||
KILL_MAIN,
|
|
||||||
KILL_CONTROL,
|
|
||||||
KILL_ALL,
|
|
||||||
_KILL_WHO_MAX,
|
|
||||||
_KILL_WHO_INVALID = -1
|
|
||||||
} KillWho;
|
|
||||||
|
|
||||||
typedef enum ExecInput {
|
typedef enum ExecInput {
|
||||||
EXEC_INPUT_NULL,
|
EXEC_INPUT_NULL,
|
||||||
EXEC_INPUT_TTY,
|
EXEC_INPUT_TTY,
|
||||||
|
@ -146,11 +130,6 @@ struct ExecContext {
|
||||||
|
|
||||||
uint64_t capability_bounding_set_drop;
|
uint64_t capability_bounding_set_drop;
|
||||||
|
|
||||||
/* Not relevant for spawning processes, just for killing */
|
|
||||||
KillMode kill_mode;
|
|
||||||
int kill_signal;
|
|
||||||
bool send_sigkill;
|
|
||||||
|
|
||||||
cap_t capabilities;
|
cap_t capabilities;
|
||||||
int secure_bits;
|
int secure_bits;
|
||||||
|
|
||||||
|
@ -228,9 +207,3 @@ ExecOutput exec_output_from_string(const char *s);
|
||||||
|
|
||||||
const char* exec_input_to_string(ExecInput i);
|
const char* exec_input_to_string(ExecInput i);
|
||||||
ExecInput exec_input_from_string(const char *s);
|
ExecInput exec_input_from_string(const char *s);
|
||||||
|
|
||||||
const char *kill_mode_to_string(KillMode k);
|
|
||||||
KillMode kill_mode_from_string(const char *s);
|
|
||||||
|
|
||||||
const char *kill_who_to_string(KillWho k);
|
|
||||||
KillWho kill_who_from_string(const char *s);
|
|
||||||
|
|
|
@ -0,0 +1,63 @@
|
||||||
|
/*-*- Mode: C; c-basic-offset: 8; indent-tabs-mode: nil -*-*/
|
||||||
|
|
||||||
|
/***
|
||||||
|
This file is part of systemd.
|
||||||
|
|
||||||
|
Copyright 2012 Lennart Poettering
|
||||||
|
|
||||||
|
systemd is free software; you can redistribute it and/or modify it
|
||||||
|
under the terms of the GNU Lesser General Public License as published by
|
||||||
|
the Free Software Foundation; either version 2.1 of the License, or
|
||||||
|
(at your option) any later version.
|
||||||
|
|
||||||
|
systemd is distributed in the hope that it will be useful, but
|
||||||
|
WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||||
|
Lesser General Public License for more details.
|
||||||
|
|
||||||
|
You should have received a copy of the GNU Lesser General Public License
|
||||||
|
along with systemd; If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
***/
|
||||||
|
|
||||||
|
#include <string.h>
|
||||||
|
|
||||||
|
#include "kill.h"
|
||||||
|
#include "util.h"
|
||||||
|
|
||||||
|
void kill_context_init(KillContext *c) {
|
||||||
|
assert(c);
|
||||||
|
|
||||||
|
c->kill_signal = SIGTERM;
|
||||||
|
c->send_sigkill = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
void kill_context_dump(KillContext *c, FILE *f, const char *prefix) {
|
||||||
|
assert(c);
|
||||||
|
|
||||||
|
if (!prefix)
|
||||||
|
prefix = "";
|
||||||
|
|
||||||
|
fprintf(f,
|
||||||
|
"%sKillMode: %s\n"
|
||||||
|
"%sKillSignal: SIG%s\n"
|
||||||
|
"%sSendSIGKILL: %s\n",
|
||||||
|
prefix, kill_mode_to_string(c->kill_mode),
|
||||||
|
prefix, signal_to_string(c->kill_signal),
|
||||||
|
prefix, yes_no(c->send_sigkill));
|
||||||
|
}
|
||||||
|
|
||||||
|
static const char* const kill_mode_table[_KILL_MODE_MAX] = {
|
||||||
|
[KILL_CONTROL_GROUP] = "control-group",
|
||||||
|
[KILL_PROCESS] = "process",
|
||||||
|
[KILL_NONE] = "none"
|
||||||
|
};
|
||||||
|
|
||||||
|
DEFINE_STRING_TABLE_LOOKUP(kill_mode, KillMode);
|
||||||
|
|
||||||
|
static const char* const kill_who_table[_KILL_WHO_MAX] = {
|
||||||
|
[KILL_MAIN] = "main",
|
||||||
|
[KILL_CONTROL] = "control",
|
||||||
|
[KILL_ALL] = "all"
|
||||||
|
};
|
||||||
|
|
||||||
|
DEFINE_STRING_TABLE_LOOKUP(kill_who, KillWho);
|
|
@ -0,0 +1,58 @@
|
||||||
|
/*-*- Mode: C; c-basic-offset: 8; indent-tabs-mode: nil -*-*/
|
||||||
|
|
||||||
|
#pragma once
|
||||||
|
|
||||||
|
/***
|
||||||
|
This file is part of systemd.
|
||||||
|
|
||||||
|
Copyright 2012 Lennart Poettering
|
||||||
|
|
||||||
|
systemd is free software; you can redistribute it and/or modify it
|
||||||
|
under the terms of the GNU Lesser General Public License as published by
|
||||||
|
the Free Software Foundation; either version 2.1 of the License, or
|
||||||
|
(at your option) any later version.
|
||||||
|
|
||||||
|
systemd is distributed in the hope that it will be useful, but
|
||||||
|
WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||||
|
Lesser General Public License for more details.
|
||||||
|
|
||||||
|
You should have received a copy of the GNU Lesser General Public License
|
||||||
|
along with systemd; If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
***/
|
||||||
|
|
||||||
|
typedef struct KillContext KillContext;
|
||||||
|
|
||||||
|
#include <stdbool.h>
|
||||||
|
#include <stdio.h>
|
||||||
|
|
||||||
|
typedef enum KillMode {
|
||||||
|
KILL_CONTROL_GROUP = 0,
|
||||||
|
KILL_PROCESS,
|
||||||
|
KILL_NONE,
|
||||||
|
_KILL_MODE_MAX,
|
||||||
|
_KILL_MODE_INVALID = -1
|
||||||
|
} KillMode;
|
||||||
|
|
||||||
|
struct KillContext {
|
||||||
|
KillMode kill_mode;
|
||||||
|
int kill_signal;
|
||||||
|
bool send_sigkill;
|
||||||
|
};
|
||||||
|
|
||||||
|
typedef enum KillWho {
|
||||||
|
KILL_MAIN,
|
||||||
|
KILL_CONTROL,
|
||||||
|
KILL_ALL,
|
||||||
|
_KILL_WHO_MAX,
|
||||||
|
_KILL_WHO_INVALID = -1
|
||||||
|
} KillWho;
|
||||||
|
|
||||||
|
void kill_context_init(KillContext *c);
|
||||||
|
void kill_context_dump(KillContext *c, FILE *f, const char *prefix);
|
||||||
|
|
||||||
|
const char *kill_mode_to_string(KillMode k);
|
||||||
|
KillMode kill_mode_from_string(const char *s);
|
||||||
|
|
||||||
|
const char *kill_who_to_string(KillWho k);
|
||||||
|
KillWho kill_who_from_string(const char *s);
|
|
@ -84,14 +84,16 @@ $1.PrivateNetwork, config_parse_bool, 0,
|
||||||
$1.MountFlags, config_parse_exec_mount_flags, 0, offsetof($1, exec_context)
|
$1.MountFlags, config_parse_exec_mount_flags, 0, offsetof($1, exec_context)
|
||||||
$1.TCPWrapName, config_parse_unit_string_printf, 0, offsetof($1, exec_context.tcpwrap_name)
|
$1.TCPWrapName, config_parse_unit_string_printf, 0, offsetof($1, exec_context.tcpwrap_name)
|
||||||
$1.PAMName, config_parse_unit_string_printf, 0, offsetof($1, exec_context.pam_name)
|
$1.PAMName, config_parse_unit_string_printf, 0, offsetof($1, exec_context.pam_name)
|
||||||
$1.KillMode, config_parse_kill_mode, 0, offsetof($1, exec_context.kill_mode)
|
|
||||||
$1.KillSignal, config_parse_kill_signal, 0, offsetof($1, exec_context.kill_signal)
|
|
||||||
$1.SendSIGKILL, config_parse_bool, 0, offsetof($1, exec_context.send_sigkill)
|
|
||||||
$1.IgnoreSIGPIPE, config_parse_bool, 0, offsetof($1, exec_context.ignore_sigpipe)
|
$1.IgnoreSIGPIPE, config_parse_bool, 0, offsetof($1, exec_context.ignore_sigpipe)
|
||||||
$1.UtmpIdentifier, config_parse_unit_string_printf, 0, offsetof($1, exec_context.utmp_id)
|
$1.UtmpIdentifier, config_parse_unit_string_printf, 0, offsetof($1, exec_context.utmp_id)
|
||||||
$1.ControlGroupModify, config_parse_bool, 0, offsetof($1, exec_context.control_group_modify)
|
$1.ControlGroupModify, config_parse_bool, 0, offsetof($1, exec_context.control_group_modify)
|
||||||
$1.ControlGroupPersistent, config_parse_tristate, 0, offsetof($1, exec_context.control_group_persistent)'
|
$1.ControlGroupPersistent, config_parse_tristate, 0, offsetof($1, exec_context.control_group_persistent)'
|
||||||
)m4_dnl
|
)m4_dnl
|
||||||
|
m4_define(`KILL_CONTEXT_CONFIG_ITEMS',
|
||||||
|
`$1.SendSIGKILL, config_parse_bool, 0, offsetof($1, kill_context.send_sigkill)
|
||||||
|
$1.KillMode, config_parse_kill_mode, 0, offsetof($1, kill_context.kill_mode)
|
||||||
|
$1.KillSignal, config_parse_kill_signal, 0, offsetof($1, kill_context.kill_signal)'
|
||||||
|
)m4_dnl
|
||||||
Unit.Description, config_parse_unit_string_printf, 0, offsetof(Unit, description)
|
Unit.Description, config_parse_unit_string_printf, 0, offsetof(Unit, description)
|
||||||
Unit.Documentation, config_parse_documentation, 0, offsetof(Unit, documentation)
|
Unit.Documentation, config_parse_documentation, 0, offsetof(Unit, documentation)
|
||||||
Unit.SourcePath, config_parse_path, 0, offsetof(Unit, source_path)
|
Unit.SourcePath, config_parse_path, 0, offsetof(Unit, source_path)
|
||||||
|
@ -162,6 +164,7 @@ Service.NotifyAccess, config_parse_notify_access, 0,
|
||||||
Service.Sockets, config_parse_service_sockets, 0, 0
|
Service.Sockets, config_parse_service_sockets, 0, 0
|
||||||
Service.FsckPassNo, config_parse_fsck_passno, 0, offsetof(Service, fsck_passno)
|
Service.FsckPassNo, config_parse_fsck_passno, 0, offsetof(Service, fsck_passno)
|
||||||
EXEC_CONTEXT_CONFIG_ITEMS(Service)m4_dnl
|
EXEC_CONTEXT_CONFIG_ITEMS(Service)m4_dnl
|
||||||
|
KILL_CONTEXT_CONFIG_ITEMS(Service)m4_dnl
|
||||||
m4_dnl
|
m4_dnl
|
||||||
Socket.ListenStream, config_parse_socket_listen, 0, 0
|
Socket.ListenStream, config_parse_socket_listen, 0, 0
|
||||||
Socket.ListenDatagram, config_parse_socket_listen, 0, 0
|
Socket.ListenDatagram, config_parse_socket_listen, 0, 0
|
||||||
|
@ -200,6 +203,7 @@ Socket.MessageQueueMaxMessages, config_parse_long, 0,
|
||||||
Socket.MessageQueueMessageSize, config_parse_long, 0, offsetof(Socket, mq_msgsize)
|
Socket.MessageQueueMessageSize, config_parse_long, 0, offsetof(Socket, mq_msgsize)
|
||||||
Socket.Service, config_parse_socket_service, 0, 0
|
Socket.Service, config_parse_socket_service, 0, 0
|
||||||
EXEC_CONTEXT_CONFIG_ITEMS(Socket)m4_dnl
|
EXEC_CONTEXT_CONFIG_ITEMS(Socket)m4_dnl
|
||||||
|
KILL_CONTEXT_CONFIG_ITEMS(Socket)m4_dnl
|
||||||
m4_dnl
|
m4_dnl
|
||||||
Mount.What, config_parse_string, 0, offsetof(Mount, parameters_fragment.what)
|
Mount.What, config_parse_string, 0, offsetof(Mount, parameters_fragment.what)
|
||||||
Mount.Where, config_parse_path, 0, offsetof(Mount, where)
|
Mount.Where, config_parse_path, 0, offsetof(Mount, where)
|
||||||
|
@ -209,6 +213,7 @@ Mount.FsckPassNo, config_parse_fsck_passno, 0,
|
||||||
Mount.TimeoutSec, config_parse_usec, 0, offsetof(Mount, timeout_usec)
|
Mount.TimeoutSec, config_parse_usec, 0, offsetof(Mount, timeout_usec)
|
||||||
Mount.DirectoryMode, config_parse_mode, 0, offsetof(Mount, directory_mode)
|
Mount.DirectoryMode, config_parse_mode, 0, offsetof(Mount, directory_mode)
|
||||||
EXEC_CONTEXT_CONFIG_ITEMS(Mount)m4_dnl
|
EXEC_CONTEXT_CONFIG_ITEMS(Mount)m4_dnl
|
||||||
|
KILL_CONTEXT_CONFIG_ITEMS(Mount)m4_dnl
|
||||||
m4_dnl
|
m4_dnl
|
||||||
Automount.Where, config_parse_path, 0, offsetof(Automount, where)
|
Automount.Where, config_parse_path, 0, offsetof(Automount, where)
|
||||||
Automount.DirectoryMode, config_parse_mode, 0, offsetof(Automount, directory_mode)
|
Automount.DirectoryMode, config_parse_mode, 0, offsetof(Automount, directory_mode)
|
||||||
|
@ -217,6 +222,7 @@ Swap.What, config_parse_path, 0,
|
||||||
Swap.Priority, config_parse_int, 0, offsetof(Swap, parameters_fragment.priority)
|
Swap.Priority, config_parse_int, 0, offsetof(Swap, parameters_fragment.priority)
|
||||||
Swap.TimeoutSec, config_parse_usec, 0, offsetof(Swap, timeout_usec)
|
Swap.TimeoutSec, config_parse_usec, 0, offsetof(Swap, timeout_usec)
|
||||||
EXEC_CONTEXT_CONFIG_ITEMS(Swap)m4_dnl
|
EXEC_CONTEXT_CONFIG_ITEMS(Swap)m4_dnl
|
||||||
|
KILL_CONTEXT_CONFIG_ITEMS(Swap)m4_dnl
|
||||||
m4_dnl
|
m4_dnl
|
||||||
Timer.OnActiveSec, config_parse_timer, 0, 0
|
Timer.OnActiveSec, config_parse_timer, 0, 0
|
||||||
Timer.OnBootSec, config_parse_timer, 0, 0
|
Timer.OnBootSec, config_parse_timer, 0, 0
|
||||||
|
|
|
@ -79,6 +79,8 @@ static void mount_init(Unit *u) {
|
||||||
m->exec_context.std_error = u->manager->default_std_error;
|
m->exec_context.std_error = u->manager->default_std_error;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
kill_context_init(&m->kill_context);
|
||||||
|
|
||||||
/* We need to make sure that /bin/mount is always called in
|
/* We need to make sure that /bin/mount is always called in
|
||||||
* the same process group as us, so that the autofs kernel
|
* the same process group as us, so that the autofs kernel
|
||||||
* side doesn't send us another mount request while we are
|
* side doesn't send us another mount request while we are
|
||||||
|
@ -529,7 +531,7 @@ static int mount_verify(Mount *m) {
|
||||||
return -EBADMSG;
|
return -EBADMSG;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (m->exec_context.pam_name && m->exec_context.kill_mode != KILL_CONTROL_GROUP) {
|
if (m->exec_context.pam_name && m->kill_context.kill_mode != KILL_CONTROL_GROUP) {
|
||||||
log_error("%s has PAM enabled. Kill mode must be set to 'control-group'. Refusing.", UNIT(m)->id);
|
log_error("%s has PAM enabled. Kill mode must be set to 'control-group'. Refusing.", UNIT(m)->id);
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
}
|
}
|
||||||
|
@ -783,6 +785,7 @@ static void mount_dump(Unit *u, FILE *f, const char *prefix) {
|
||||||
prefix, (unsigned long) m->control_pid);
|
prefix, (unsigned long) m->control_pid);
|
||||||
|
|
||||||
exec_context_dump(&m->exec_context, f, prefix);
|
exec_context_dump(&m->exec_context, f, prefix);
|
||||||
|
kill_context_dump(&m->kill_context, f, prefix);
|
||||||
}
|
}
|
||||||
|
|
||||||
static int mount_spawn(Mount *m, ExecCommand *c, pid_t *_pid) {
|
static int mount_spawn(Mount *m, ExecCommand *c, pid_t *_pid) {
|
||||||
|
@ -855,10 +858,10 @@ static void mount_enter_signal(Mount *m, MountState state, MountResult f) {
|
||||||
if (f != MOUNT_SUCCESS)
|
if (f != MOUNT_SUCCESS)
|
||||||
m->result = f;
|
m->result = f;
|
||||||
|
|
||||||
if (m->exec_context.kill_mode != KILL_NONE) {
|
if (m->kill_context.kill_mode != KILL_NONE) {
|
||||||
int sig = (state == MOUNT_MOUNTING_SIGTERM ||
|
int sig = (state == MOUNT_MOUNTING_SIGTERM ||
|
||||||
state == MOUNT_UNMOUNTING_SIGTERM ||
|
state == MOUNT_UNMOUNTING_SIGTERM ||
|
||||||
state == MOUNT_REMOUNTING_SIGTERM) ? m->exec_context.kill_signal : SIGKILL;
|
state == MOUNT_REMOUNTING_SIGTERM) ? m->kill_context.kill_signal : SIGKILL;
|
||||||
|
|
||||||
if (m->control_pid > 0) {
|
if (m->control_pid > 0) {
|
||||||
if (kill_and_sigcont(m->control_pid, sig) < 0 && errno != ESRCH)
|
if (kill_and_sigcont(m->control_pid, sig) < 0 && errno != ESRCH)
|
||||||
|
@ -868,7 +871,7 @@ static void mount_enter_signal(Mount *m, MountState state, MountResult f) {
|
||||||
wait_for_exit = true;
|
wait_for_exit = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (m->exec_context.kill_mode == KILL_CONTROL_GROUP) {
|
if (m->kill_context.kill_mode == KILL_CONTROL_GROUP) {
|
||||||
|
|
||||||
if (!(pid_set = set_new(trivial_hash_func, trivial_compare_func))) {
|
if (!(pid_set = set_new(trivial_hash_func, trivial_compare_func))) {
|
||||||
r = -ENOMEM;
|
r = -ENOMEM;
|
||||||
|
@ -1327,7 +1330,7 @@ static void mount_timer_event(Unit *u, uint64_t elapsed, Watch *w) {
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case MOUNT_MOUNTING_SIGTERM:
|
case MOUNT_MOUNTING_SIGTERM:
|
||||||
if (m->exec_context.send_sigkill) {
|
if (m->kill_context.send_sigkill) {
|
||||||
log_warning("%s mounting timed out. Killing.", u->id);
|
log_warning("%s mounting timed out. Killing.", u->id);
|
||||||
mount_enter_signal(m, MOUNT_MOUNTING_SIGKILL, MOUNT_FAILURE_TIMEOUT);
|
mount_enter_signal(m, MOUNT_MOUNTING_SIGKILL, MOUNT_FAILURE_TIMEOUT);
|
||||||
} else {
|
} else {
|
||||||
|
@ -1341,7 +1344,7 @@ static void mount_timer_event(Unit *u, uint64_t elapsed, Watch *w) {
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case MOUNT_REMOUNTING_SIGTERM:
|
case MOUNT_REMOUNTING_SIGTERM:
|
||||||
if (m->exec_context.send_sigkill) {
|
if (m->kill_context.send_sigkill) {
|
||||||
log_warning("%s remounting timed out. Killing.", u->id);
|
log_warning("%s remounting timed out. Killing.", u->id);
|
||||||
mount_enter_signal(m, MOUNT_REMOUNTING_SIGKILL, MOUNT_FAILURE_TIMEOUT);
|
mount_enter_signal(m, MOUNT_REMOUNTING_SIGKILL, MOUNT_FAILURE_TIMEOUT);
|
||||||
} else {
|
} else {
|
||||||
|
@ -1355,7 +1358,7 @@ static void mount_timer_event(Unit *u, uint64_t elapsed, Watch *w) {
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case MOUNT_UNMOUNTING_SIGTERM:
|
case MOUNT_UNMOUNTING_SIGTERM:
|
||||||
if (m->exec_context.send_sigkill) {
|
if (m->kill_context.send_sigkill) {
|
||||||
log_warning("%s unmounting timed out. Killing.", u->id);
|
log_warning("%s unmounting timed out. Killing.", u->id);
|
||||||
mount_enter_signal(m, MOUNT_UNMOUNTING_SIGKILL, MOUNT_FAILURE_TIMEOUT);
|
mount_enter_signal(m, MOUNT_UNMOUNTING_SIGKILL, MOUNT_FAILURE_TIMEOUT);
|
||||||
} else {
|
} else {
|
||||||
|
|
|
@ -24,6 +24,7 @@
|
||||||
typedef struct Mount Mount;
|
typedef struct Mount Mount;
|
||||||
|
|
||||||
#include "unit.h"
|
#include "unit.h"
|
||||||
|
#include "kill.h"
|
||||||
|
|
||||||
typedef enum MountState {
|
typedef enum MountState {
|
||||||
MOUNT_DEAD,
|
MOUNT_DEAD,
|
||||||
|
@ -95,6 +96,7 @@ struct Mount {
|
||||||
|
|
||||||
ExecCommand exec_command[_MOUNT_EXEC_COMMAND_MAX];
|
ExecCommand exec_command[_MOUNT_EXEC_COMMAND_MAX];
|
||||||
ExecContext exec_context;
|
ExecContext exec_context;
|
||||||
|
KillContext kill_context;
|
||||||
|
|
||||||
MountState state, deserialized_state;
|
MountState state, deserialized_state;
|
||||||
|
|
||||||
|
|
|
@ -153,6 +153,7 @@ static void service_init(Unit *u) {
|
||||||
for (i = 0; i < RLIMIT_NLIMITS; i++)
|
for (i = 0; i < RLIMIT_NLIMITS; i++)
|
||||||
if (UNIT(s)->manager->rlimit[i])
|
if (UNIT(s)->manager->rlimit[i])
|
||||||
s->exec_context.rlimit[i] = newdup(struct rlimit, UNIT(s)->manager->rlimit[i], 1);
|
s->exec_context.rlimit[i] = newdup(struct rlimit, UNIT(s)->manager->rlimit[i], 1);
|
||||||
|
kill_context_init(&s->kill_context);
|
||||||
|
|
||||||
RATELIMIT_INIT(s->start_limit, 10*USEC_PER_SEC, 5);
|
RATELIMIT_INIT(s->start_limit, 10*USEC_PER_SEC, 5);
|
||||||
|
|
||||||
|
@ -928,7 +929,7 @@ static int service_load_sysv_path(Service *s, const char *path) {
|
||||||
s->guess_main_pid = false;
|
s->guess_main_pid = false;
|
||||||
s->restart = SERVICE_RESTART_NO;
|
s->restart = SERVICE_RESTART_NO;
|
||||||
s->exec_context.ignore_sigpipe = false;
|
s->exec_context.ignore_sigpipe = false;
|
||||||
s->exec_context.kill_mode = KILL_PROCESS;
|
s->kill_context.kill_mode = KILL_PROCESS;
|
||||||
|
|
||||||
/* We use the long description only if
|
/* We use the long description only if
|
||||||
* no short description is set. */
|
* no short description is set. */
|
||||||
|
@ -1164,7 +1165,7 @@ static int service_verify(Service *s) {
|
||||||
if (s->bus_name && s->type != SERVICE_DBUS)
|
if (s->bus_name && s->type != SERVICE_DBUS)
|
||||||
log_warning("%s has a D-Bus service name specified, but is not of type dbus. Ignoring.", UNIT(s)->id);
|
log_warning("%s has a D-Bus service name specified, but is not of type dbus. Ignoring.", UNIT(s)->id);
|
||||||
|
|
||||||
if (s->exec_context.pam_name && s->exec_context.kill_mode != KILL_CONTROL_GROUP) {
|
if (s->exec_context.pam_name && s->kill_context.kill_mode != KILL_CONTROL_GROUP) {
|
||||||
log_error("%s has PAM enabled. Kill mode must be set to 'control-group'. Refusing.", UNIT(s)->id);
|
log_error("%s has PAM enabled. Kill mode must be set to 'control-group'. Refusing.", UNIT(s)->id);
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
}
|
}
|
||||||
|
@ -1351,6 +1352,7 @@ static void service_dump(Unit *u, FILE *f, const char *prefix) {
|
||||||
prefix, s->bus_name,
|
prefix, s->bus_name,
|
||||||
prefix, yes_no(s->bus_name_good));
|
prefix, yes_no(s->bus_name_good));
|
||||||
|
|
||||||
|
kill_context_dump(&s->kill_context, f, prefix);
|
||||||
exec_context_dump(&s->exec_context, f, prefix);
|
exec_context_dump(&s->exec_context, f, prefix);
|
||||||
|
|
||||||
for (c = 0; c < _SERVICE_EXEC_COMMAND_MAX; c++) {
|
for (c = 0; c < _SERVICE_EXEC_COMMAND_MAX; c++) {
|
||||||
|
@ -1967,8 +1969,8 @@ static void service_enter_signal(Service *s, ServiceState state, ServiceResult f
|
||||||
if (f != SERVICE_SUCCESS)
|
if (f != SERVICE_SUCCESS)
|
||||||
s->result = f;
|
s->result = f;
|
||||||
|
|
||||||
if (s->exec_context.kill_mode != KILL_NONE) {
|
if (s->kill_context.kill_mode != KILL_NONE) {
|
||||||
int sig = (state == SERVICE_STOP_SIGTERM || state == SERVICE_FINAL_SIGTERM) ? s->exec_context.kill_signal : SIGKILL;
|
int sig = (state == SERVICE_STOP_SIGTERM || state == SERVICE_FINAL_SIGTERM) ? s->kill_context.kill_signal : SIGKILL;
|
||||||
|
|
||||||
if (s->main_pid > 0) {
|
if (s->main_pid > 0) {
|
||||||
if (kill_and_sigcont(s->main_pid, sig) < 0 && errno != ESRCH)
|
if (kill_and_sigcont(s->main_pid, sig) < 0 && errno != ESRCH)
|
||||||
|
@ -1984,9 +1986,10 @@ static void service_enter_signal(Service *s, ServiceState state, ServiceResult f
|
||||||
wait_for_exit = true;
|
wait_for_exit = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (s->exec_context.kill_mode == KILL_CONTROL_GROUP) {
|
if (s->kill_context.kill_mode == KILL_CONTROL_GROUP) {
|
||||||
|
|
||||||
if (!(pid_set = set_new(trivial_hash_func, trivial_compare_func))) {
|
pid_set = set_new(trivial_hash_func, trivial_compare_func);
|
||||||
|
if (!pid_set) {
|
||||||
r = -ENOMEM;
|
r = -ENOMEM;
|
||||||
goto fail;
|
goto fail;
|
||||||
}
|
}
|
||||||
|
@ -3144,7 +3147,7 @@ static void service_timer_event(Unit *u, uint64_t elapsed, Watch* w) {
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case SERVICE_STOP_SIGTERM:
|
case SERVICE_STOP_SIGTERM:
|
||||||
if (s->exec_context.send_sigkill) {
|
if (s->kill_context.send_sigkill) {
|
||||||
log_warning("%s stopping timed out. Killing.", u->id);
|
log_warning("%s stopping timed out. Killing.", u->id);
|
||||||
service_enter_signal(s, SERVICE_STOP_SIGKILL, SERVICE_FAILURE_TIMEOUT);
|
service_enter_signal(s, SERVICE_STOP_SIGKILL, SERVICE_FAILURE_TIMEOUT);
|
||||||
} else {
|
} else {
|
||||||
|
@ -3169,7 +3172,7 @@ static void service_timer_event(Unit *u, uint64_t elapsed, Watch* w) {
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case SERVICE_FINAL_SIGTERM:
|
case SERVICE_FINAL_SIGTERM:
|
||||||
if (s->exec_context.send_sigkill) {
|
if (s->kill_context.send_sigkill) {
|
||||||
log_warning("%s stopping timed out (2). Killing.", u->id);
|
log_warning("%s stopping timed out (2). Killing.", u->id);
|
||||||
service_enter_signal(s, SERVICE_FINAL_SIGKILL, SERVICE_FAILURE_TIMEOUT);
|
service_enter_signal(s, SERVICE_FINAL_SIGKILL, SERVICE_FAILURE_TIMEOUT);
|
||||||
} else {
|
} else {
|
||||||
|
|
|
@ -27,6 +27,7 @@ typedef struct Service Service;
|
||||||
#include "path.h"
|
#include "path.h"
|
||||||
#include "ratelimit.h"
|
#include "ratelimit.h"
|
||||||
#include "service.h"
|
#include "service.h"
|
||||||
|
#include "kill.h"
|
||||||
|
|
||||||
typedef enum ServiceState {
|
typedef enum ServiceState {
|
||||||
SERVICE_DEAD,
|
SERVICE_DEAD,
|
||||||
|
@ -126,7 +127,9 @@ struct Service {
|
||||||
Watch watchdog_watch;
|
Watch watchdog_watch;
|
||||||
|
|
||||||
ExecCommand* exec_command[_SERVICE_EXEC_COMMAND_MAX];
|
ExecCommand* exec_command[_SERVICE_EXEC_COMMAND_MAX];
|
||||||
|
|
||||||
ExecContext exec_context;
|
ExecContext exec_context;
|
||||||
|
KillContext kill_context;
|
||||||
|
|
||||||
ServiceState state, deserialized_state;
|
ServiceState state, deserialized_state;
|
||||||
|
|
||||||
|
|
|
@ -83,6 +83,7 @@ static void socket_init(Unit *u) {
|
||||||
exec_context_init(&s->exec_context);
|
exec_context_init(&s->exec_context);
|
||||||
s->exec_context.std_output = u->manager->default_std_output;
|
s->exec_context.std_output = u->manager->default_std_output;
|
||||||
s->exec_context.std_error = u->manager->default_std_error;
|
s->exec_context.std_error = u->manager->default_std_error;
|
||||||
|
kill_context_init(&s->kill_context);
|
||||||
|
|
||||||
s->control_command_id = _SOCKET_EXEC_COMMAND_INVALID;
|
s->control_command_id = _SOCKET_EXEC_COMMAND_INVALID;
|
||||||
}
|
}
|
||||||
|
@ -223,7 +224,7 @@ static int socket_verify(Socket *s) {
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (s->exec_context.pam_name && s->exec_context.kill_mode != KILL_CONTROL_GROUP) {
|
if (s->exec_context.pam_name && s->kill_context.kill_mode != KILL_CONTROL_GROUP) {
|
||||||
log_error("%s has PAM enabled. Kill mode must be set to 'control-group'. Refusing.", UNIT(s)->id);
|
log_error("%s has PAM enabled. Kill mode must be set to 'control-group'. Refusing.", UNIT(s)->id);
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
}
|
}
|
||||||
|
@ -526,6 +527,7 @@ static void socket_dump(Unit *u, FILE *f, const char *prefix) {
|
||||||
}
|
}
|
||||||
|
|
||||||
exec_context_dump(&s->exec_context, f, prefix);
|
exec_context_dump(&s->exec_context, f, prefix);
|
||||||
|
kill_context_dump(&s->kill_context, f, prefix);
|
||||||
|
|
||||||
for (c = 0; c < _SOCKET_EXEC_COMMAND_MAX; c++) {
|
for (c = 0; c < _SOCKET_EXEC_COMMAND_MAX; c++) {
|
||||||
if (!s->exec_command[c])
|
if (!s->exec_command[c])
|
||||||
|
@ -1226,8 +1228,8 @@ static void socket_enter_signal(Socket *s, SocketState state, SocketResult f) {
|
||||||
if (f != SOCKET_SUCCESS)
|
if (f != SOCKET_SUCCESS)
|
||||||
s->result = f;
|
s->result = f;
|
||||||
|
|
||||||
if (s->exec_context.kill_mode != KILL_NONE) {
|
if (s->kill_context.kill_mode != KILL_NONE) {
|
||||||
int sig = (state == SOCKET_STOP_PRE_SIGTERM || state == SOCKET_FINAL_SIGTERM) ? s->exec_context.kill_signal : SIGKILL;
|
int sig = (state == SOCKET_STOP_PRE_SIGTERM || state == SOCKET_FINAL_SIGTERM) ? s->kill_context.kill_signal : SIGKILL;
|
||||||
|
|
||||||
if (s->control_pid > 0) {
|
if (s->control_pid > 0) {
|
||||||
if (kill_and_sigcont(s->control_pid, sig) < 0 && errno != ESRCH)
|
if (kill_and_sigcont(s->control_pid, sig) < 0 && errno != ESRCH)
|
||||||
|
@ -1237,7 +1239,7 @@ static void socket_enter_signal(Socket *s, SocketState state, SocketResult f) {
|
||||||
wait_for_exit = true;
|
wait_for_exit = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (s->exec_context.kill_mode == KILL_CONTROL_GROUP) {
|
if (s->kill_context.kill_mode == KILL_CONTROL_GROUP) {
|
||||||
|
|
||||||
if (!(pid_set = set_new(trivial_hash_func, trivial_compare_func))) {
|
if (!(pid_set = set_new(trivial_hash_func, trivial_compare_func))) {
|
||||||
r = -ENOMEM;
|
r = -ENOMEM;
|
||||||
|
@ -1983,7 +1985,7 @@ static void socket_timer_event(Unit *u, uint64_t elapsed, Watch *w) {
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case SOCKET_STOP_PRE_SIGTERM:
|
case SOCKET_STOP_PRE_SIGTERM:
|
||||||
if (s->exec_context.send_sigkill) {
|
if (s->kill_context.send_sigkill) {
|
||||||
log_warning("%s stopping timed out. Killing.", u->id);
|
log_warning("%s stopping timed out. Killing.", u->id);
|
||||||
socket_enter_signal(s, SOCKET_STOP_PRE_SIGKILL, SOCKET_FAILURE_TIMEOUT);
|
socket_enter_signal(s, SOCKET_STOP_PRE_SIGKILL, SOCKET_FAILURE_TIMEOUT);
|
||||||
} else {
|
} else {
|
||||||
|
@ -2003,7 +2005,7 @@ static void socket_timer_event(Unit *u, uint64_t elapsed, Watch *w) {
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case SOCKET_FINAL_SIGTERM:
|
case SOCKET_FINAL_SIGTERM:
|
||||||
if (s->exec_context.send_sigkill) {
|
if (s->kill_context.send_sigkill) {
|
||||||
log_warning("%s stopping timed out (2). Killing.", u->id);
|
log_warning("%s stopping timed out (2). Killing.", u->id);
|
||||||
socket_enter_signal(s, SOCKET_FINAL_SIGKILL, SOCKET_FAILURE_TIMEOUT);
|
socket_enter_signal(s, SOCKET_FINAL_SIGKILL, SOCKET_FAILURE_TIMEOUT);
|
||||||
} else {
|
} else {
|
||||||
|
|
|
@ -101,6 +101,7 @@ struct Socket {
|
||||||
|
|
||||||
ExecCommand* exec_command[_SOCKET_EXEC_COMMAND_MAX];
|
ExecCommand* exec_command[_SOCKET_EXEC_COMMAND_MAX];
|
||||||
ExecContext exec_context;
|
ExecContext exec_context;
|
||||||
|
KillContext kill_context;
|
||||||
|
|
||||||
/* For Accept=no sockets refers to the one service we'll
|
/* For Accept=no sockets refers to the one service we'll
|
||||||
activate. For Accept=yes sockets is either NULL, or filled
|
activate. For Accept=yes sockets is either NULL, or filled
|
||||||
|
|
|
@ -86,6 +86,7 @@ static void swap_init(Unit *u) {
|
||||||
exec_context_init(&s->exec_context);
|
exec_context_init(&s->exec_context);
|
||||||
s->exec_context.std_output = u->manager->default_std_output;
|
s->exec_context.std_output = u->manager->default_std_output;
|
||||||
s->exec_context.std_error = u->manager->default_std_error;
|
s->exec_context.std_error = u->manager->default_std_error;
|
||||||
|
kill_context_init(&s->kill_context);
|
||||||
|
|
||||||
s->parameters_proc_swaps.priority = s->parameters_fragment.priority = -1;
|
s->parameters_proc_swaps.priority = s->parameters_fragment.priority = -1;
|
||||||
|
|
||||||
|
@ -235,7 +236,7 @@ static int swap_verify(Swap *s) {
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (s->exec_context.pam_name && s->exec_context.kill_mode != KILL_CONTROL_GROUP) {
|
if (s->exec_context.pam_name && s->kill_context.kill_mode != KILL_CONTROL_GROUP) {
|
||||||
log_error("%s has PAM enabled. Kill mode must be set to 'control-group'. Refusing.", UNIT(s)->id);
|
log_error("%s has PAM enabled. Kill mode must be set to 'control-group'. Refusing.", UNIT(s)->id);
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
}
|
}
|
||||||
|
@ -569,6 +570,7 @@ static void swap_dump(Unit *u, FILE *f, const char *prefix) {
|
||||||
prefix, (unsigned long) s->control_pid);
|
prefix, (unsigned long) s->control_pid);
|
||||||
|
|
||||||
exec_context_dump(&s->exec_context, f, prefix);
|
exec_context_dump(&s->exec_context, f, prefix);
|
||||||
|
kill_context_dump(&s->kill_context, f, prefix);
|
||||||
}
|
}
|
||||||
|
|
||||||
static int swap_spawn(Swap *s, ExecCommand *c, pid_t *_pid) {
|
static int swap_spawn(Swap *s, ExecCommand *c, pid_t *_pid) {
|
||||||
|
@ -641,9 +643,9 @@ static void swap_enter_signal(Swap *s, SwapState state, SwapResult f) {
|
||||||
if (f != SWAP_SUCCESS)
|
if (f != SWAP_SUCCESS)
|
||||||
s->result = f;
|
s->result = f;
|
||||||
|
|
||||||
if (s->exec_context.kill_mode != KILL_NONE) {
|
if (s->kill_context.kill_mode != KILL_NONE) {
|
||||||
int sig = (state == SWAP_ACTIVATING_SIGTERM ||
|
int sig = (state == SWAP_ACTIVATING_SIGTERM ||
|
||||||
state == SWAP_DEACTIVATING_SIGTERM) ? s->exec_context.kill_signal : SIGKILL;
|
state == SWAP_DEACTIVATING_SIGTERM) ? s->kill_context.kill_signal : SIGKILL;
|
||||||
|
|
||||||
if (s->control_pid > 0) {
|
if (s->control_pid > 0) {
|
||||||
if (kill_and_sigcont(s->control_pid, sig) < 0 && errno != ESRCH)
|
if (kill_and_sigcont(s->control_pid, sig) < 0 && errno != ESRCH)
|
||||||
|
@ -653,7 +655,7 @@ static void swap_enter_signal(Swap *s, SwapState state, SwapResult f) {
|
||||||
wait_for_exit = true;
|
wait_for_exit = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (s->exec_context.kill_mode == KILL_CONTROL_GROUP) {
|
if (s->kill_context.kill_mode == KILL_CONTROL_GROUP) {
|
||||||
|
|
||||||
if (!(pid_set = set_new(trivial_hash_func, trivial_compare_func))) {
|
if (!(pid_set = set_new(trivial_hash_func, trivial_compare_func))) {
|
||||||
r = -ENOMEM;
|
r = -ENOMEM;
|
||||||
|
@ -993,7 +995,7 @@ static void swap_timer_event(Unit *u, uint64_t elapsed, Watch *w) {
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case SWAP_ACTIVATING_SIGTERM:
|
case SWAP_ACTIVATING_SIGTERM:
|
||||||
if (s->exec_context.send_sigkill) {
|
if (s->kill_context.send_sigkill) {
|
||||||
log_warning("%s activation timed out. Killing.", u->id);
|
log_warning("%s activation timed out. Killing.", u->id);
|
||||||
swap_enter_signal(s, SWAP_ACTIVATING_SIGKILL, SWAP_FAILURE_TIMEOUT);
|
swap_enter_signal(s, SWAP_ACTIVATING_SIGKILL, SWAP_FAILURE_TIMEOUT);
|
||||||
} else {
|
} else {
|
||||||
|
@ -1003,7 +1005,7 @@ static void swap_timer_event(Unit *u, uint64_t elapsed, Watch *w) {
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case SWAP_DEACTIVATING_SIGTERM:
|
case SWAP_DEACTIVATING_SIGTERM:
|
||||||
if (s->exec_context.send_sigkill) {
|
if (s->kill_context.send_sigkill) {
|
||||||
log_warning("%s deactivation timed out. Killing.", u->id);
|
log_warning("%s deactivation timed out. Killing.", u->id);
|
||||||
swap_enter_signal(s, SWAP_DEACTIVATING_SIGKILL, SWAP_FAILURE_TIMEOUT);
|
swap_enter_signal(s, SWAP_DEACTIVATING_SIGKILL, SWAP_FAILURE_TIMEOUT);
|
||||||
} else {
|
} else {
|
||||||
|
|
|
@ -87,6 +87,7 @@ struct Swap {
|
||||||
|
|
||||||
ExecCommand exec_command[_SWAP_EXEC_COMMAND_MAX];
|
ExecCommand exec_command[_SWAP_EXEC_COMMAND_MAX];
|
||||||
ExecContext exec_context;
|
ExecContext exec_context;
|
||||||
|
KillContext kill_context;
|
||||||
|
|
||||||
SwapState state, deserialized_state;
|
SwapState state, deserialized_state;
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue