diff options
author | Zbigniew Jędrzejewski-Szmek <zbyszek@in.waw.pl> | 2014-10-21 18:44:09 -0400 |
---|---|---|
committer | Zbigniew Jędrzejewski-Szmek <zbyszek@in.waw.pl> | 2014-10-23 00:17:18 -0400 |
commit | a9becdd65bb4b64675bc0c109d14ab12b1ecd2b7 (patch) | |
tree | 45faa8c9e120afe1e8227926bc238d5e0eeb2920 | |
parent | 203af57fcdced5debfc26e1083eaefa031e322f4 (diff) |
sd-daemon,man: ignore missing $WATCHDOG_PID
Systemd 209 started setting $WATCHDOG_PID, and sd-daemon watch was
modified to check for this variable. This means that
sd_watchdog_enabled() stopped working with previous versions of
systemd. But sd-event is a public library and API and we must keep it
working even when a program compiled with a newer version of the
libary is used on a system running an older version of the manager.
getenv() and unsetenv() are fairly expensive calls, so optimize
sd_watchdog_enabled() by not calling them when unnecessary.
man: centralize the description of $WATCHDOG_PID and $WATCHDOG_USEC in
the sd_watchdog_enabled manpage. It is better not to repeat the same
stuff in two places.
-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; } |