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 @@
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 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.
+ 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 46241f77ff..1f2a53393f 100644
--- a/src/libsystemd/sd-daemon/sd-daemon.c
+++ b/src/libsystemd/sd-daemon/sd-daemon.c
@@ -491,34 +491,15 @@ _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;
- goto finish;
- }
-
- r = parse_pid(e, &pid);
- if (r < 0)
+ s = getenv("WATCHDOG_USEC");
+ if (!s)
goto finish;
- /* Is this for us? */
- if (getpid() != pid) {
- r = 0;
- goto finish;
- }
-
- e = getenv("WATCHDOG_USEC");
- if (!e) {
- r = -EINVAL;
- goto finish;
- }
-
- r = safe_atou64(e, &u);
+ r = safe_atou64(s, &u);
if (r < 0)
goto finish;
if (u <= 0) {
@@ -526,16 +507,31 @@ _public_ int sd_watchdog_enabled(int unset_environment, uint64_t *usec) {
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)
*usec = u;
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;
}