diff options
-rw-r--r-- | man/sd_notify.xml | 15 | ||||
-rw-r--r-- | man/sd_watchdog_enabled.xml | 53 | ||||
-rw-r--r-- | src/libsystemd/sd-daemon/sd-daemon.c | 48 |
3 files changed, 63 insertions, 53 deletions
diff --git a/man/sd_notify.xml b/man/sd_notify.xml index fbb882dfd2..35f6f71ab3 100644 --- a/man/sd_notify.xml +++ b/man/sd_notify.xml @@ -192,17 +192,12 @@ <varname>WatchdogSec=</varname> is enabled for it. See <citerefentry><refentrytitle>systemd.service</refentrytitle><manvolnum>5</manvolnum></citerefentry> - for details. It is recommended to send - this message if the - <varname>$WATCHDOG_PID</varname> - environment variable has been set to - the PID of the service process, in - every half the time interval that is - specified in the - <varname>$WATCHDOG_USEC</varname> - environment variable. See + for information how to enable this + functionality and <citerefentry><refentrytitle>sd_watchdog_enabled</refentrytitle><manvolnum>3</manvolnum></citerefentry> - for details.</para></listitem> + for the details of how the service can + check if the the watchdog is enabled. + </para></listitem> </varlistentry> </variablelist> diff --git a/man/sd_watchdog_enabled.xml b/man/sd_watchdog_enabled.xml index 4164027640..462d7c6617 100644 --- a/man/sd_watchdog_enabled.xml +++ b/man/sd_watchdog_enabled.xml @@ -69,30 +69,37 @@ which the manager will act on the service if it did not get such a notification.</para> + <para>If the <varname>$WATCHDOG_USEC</varname> + environment variable is set, and the + <varname>$WATCHDOG_PID</varname> variable is unset or + set to the PID of the current process, the service + manager expects notifications from this process. The + manager will usually terminate a service when it does + not get a notification message within the specified + time after startup and after each previous message. It + is recommended that a daemon sends a keep-alive + notification message to the service manager every half + of the time returned here. Notification messages may + be sent with + <citerefentry><refentrytitle>sd_notify</refentrytitle><manvolnum>3</manvolnum></citerefentry> + with a message string of + <literal>WATCHDOG=1</literal>.</para> + <para>If the <parameter>unset_environment</parameter> parameter is non-zero, <function>sd_watchdog_enabled()</function> will unset the <varname>$WATCHDOG_USEC</varname> and <varname>$WATCHDOG_PID</varname> environment variables - before returning (regardless of whether the function call - itself succeeded or not). Further calls to - <function>sd_watchdog_enabled()</function> will then - return with zero, but the variable is no longer - inherited by child processes.</para> + before returning (regardless of whether the function + call itself succeeded or not). Those variables are no + longer inherited by child processes. Further calls to + <function>sd_watchdog_enabled()</function> will also + return with zero.</para> <para>If the <parameter>usec</parameter> parameter is non-NULL, <function>sd_watchdog_enabled()</function> - will return the timeout in µs for the watchdog - logic. The service manager will usually terminate a - service when it did not get a notification message - within the specified time after startup and after each - previous message. It is recommended that a daemon - sends a keep-alive notification message to the service - manager every half of the time returned - here. Notification messages may be sent with - <citerefentry><refentrytitle>sd_notify</refentrytitle><manvolnum>3</manvolnum></citerefentry> - with a message string of - <literal>WATCHDOG=1</literal>.</para> + will write the timeout in µs for the watchdog + logic to it.</para> <para>To enable service supervision with the watchdog logic, use <varname>WatchdogSec=</varname> in service @@ -126,7 +133,6 @@ of the current process, under the assumption that in that case, the variables were set for a different process further up the process tree.</para> - </refsect1> <refsect1> @@ -157,6 +163,19 @@ </refsect1> <refsect1> + <title>History</title> + + <para>The watchdog functionality and the + <varname>$WATCHDOG_USEC</varname> variable were + added in systemd-41.</para> + + <para><function>sd_watchdog_enabled()</function> + function was added in systemd-209. Since that version + the <varname>$WATCHDOG_PID</varname> variable is also + set.</para> + </refsect1> + + <refsect1> <title>See Also</title> <para> <citerefentry><refentrytitle>systemd</refentrytitle><manvolnum>1</manvolnum></citerefentry>, diff --git a/src/libsystemd/sd-daemon/sd-daemon.c b/src/libsystemd/sd-daemon/sd-daemon.c index 46241f77ff..1f2a53393f 100644 --- a/src/libsystemd/sd-daemon/sd-daemon.c +++ b/src/libsystemd/sd-daemon/sd-daemon.c @@ -491,39 +491,35 @@ _public_ int sd_booted(void) { } _public_ int sd_watchdog_enabled(int unset_environment, uint64_t *usec) { - const char *e; + const char *s, *p = ""; /* p is set to dummy value to do unsetting */ uint64_t u; - pid_t pid; - int r; + int r = 0; - e = getenv("WATCHDOG_PID"); - if (!e) { - r = 0; + s = getenv("WATCHDOG_USEC"); + if (!s) goto finish; - } - r = parse_pid(e, &pid); + r = safe_atou64(s, &u); if (r < 0) goto finish; - - /* Is this for us? */ - if (getpid() != pid) { - r = 0; - goto finish; - } - - e = getenv("WATCHDOG_USEC"); - if (!e) { + if (u <= 0) { r = -EINVAL; goto finish; } - r = safe_atou64(e, &u); - if (r < 0) - goto finish; - if (u <= 0) { - r = -EINVAL; - goto finish; + p = getenv("WATCHDOG_PID"); + if (p) { + pid_t pid; + + r = parse_pid(p, &pid); + if (r < 0) + goto finish; + + /* Is this for us? */ + if (getpid() != pid) { + r = 0; + goto finish; + } } if (usec) @@ -532,10 +528,10 @@ _public_ int sd_watchdog_enabled(int unset_environment, uint64_t *usec) { r = 1; finish: - if (unset_environment) { - unsetenv("WATCHDOG_PID"); + if (unset_environment && s) unsetenv("WATCHDOG_USEC"); - } + if (unset_environment && p) + unsetenv("WATCHDOG_PID"); return r; } |