From: Zbigniew Jędrzejewski-Szmek Date: Tue, 21 Oct 2014 22:44:09 +0000 (-0400) Subject: sd-daemon,man: ignore missing $WATCHDOG_PID X-Git-Tag: v217~145 X-Git-Url: https://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git?p=elogind.git;a=commitdiff_plain;h=a9becdd65bb4b64675bc0c109d14ab12b1ecd2b7 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. --- diff --git a/man/sd_notify.xml b/man/sd_notify.xml index fbb882dfd..35f6f71ab 100644 --- a/man/sd_notify.xml +++ b/man/sd_notify.xml @@ -192,17 +192,12 @@ WatchdogSec= is enabled for it. See systemd.service5 - for details. It is recommended to send - this message if the - $WATCHDOG_PID - environment variable has been set to - the PID of the service process, in - every half the time interval that is - specified in the - $WATCHDOG_USEC - environment variable. See + for information how to enable this + functionality and sd_watchdog_enabled3 - for details. + for the details of how the service can + check if the the watchdog is enabled. + diff --git a/man/sd_watchdog_enabled.xml b/man/sd_watchdog_enabled.xml index 416402764..462d7c661 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. + If the $WATCHDOG_USEC + environment variable is set, and the + $WATCHDOG_PID 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 + sd_notify3 + with a message string of + WATCHDOG=1. + If the unset_environment parameter is non-zero, sd_watchdog_enabled() will unset the $WATCHDOG_USEC and $WATCHDOG_PID environment variables - before returning (regardless of whether the function call - itself succeeded or not). Further calls to - sd_watchdog_enabled() will then - return with zero, but the variable is no longer - inherited by child processes. + before returning (regardless of whether the function + call itself succeeded or not). Those variables are no + longer inherited by child processes. Further calls to + sd_watchdog_enabled() will also + return with zero. If the usec parameter is non-NULL, sd_watchdog_enabled() - 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 - sd_notify3 - with a message string of - WATCHDOG=1. + will write the timeout in µs for the watchdog + logic to it. To enable service supervision with the watchdog logic, use WatchdogSec= 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. - @@ -156,6 +162,19 @@ + + History + + The watchdog functionality and the + $WATCHDOG_USEC variable were + added in systemd-41. + + sd_watchdog_enabled() + function was added in systemd-209. Since that version + the $WATCHDOG_PID variable is also + set. + + See Also diff --git a/src/libsystemd/sd-daemon/sd-daemon.c b/src/libsystemd/sd-daemon/sd-daemon.c index 46241f77f..1f2a53393 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; }