mirror of
https://github.com/systemd/systemd.git
synced 2024-12-23 21:35:11 +03:00
core: immediately trigger watchdog action on WATCHDOG=trigger
A service might be able to detect errors by itself that may require the system to take the same action as if the service locked up. Add a WATCHDOG=trigger state change notification to sd_notify() to let the service manager know about the self-detected misery and instantly trigger the configured watchdog behaviour.
This commit is contained in:
parent
1329fee5da
commit
99b43caf26
@ -173,6 +173,18 @@
|
||||
watchdog is enabled. </para></listitem>
|
||||
</varlistentry>
|
||||
|
||||
<varlistentry>
|
||||
<term>WATCHDOG=trigger</term>
|
||||
|
||||
<listitem><para>Tells the service manager that the service detected an internal error that should be handled by
|
||||
the configured watchdog options. This will trigger the same behaviour as if <varname>WatchdogSec=</varname> is
|
||||
enabled and the service did not send <literal>WATCHDOG=1</literal> in time. Note that
|
||||
<varname>WatchdogSec=</varname> does not need to be enabled for <literal>WATCHDOG=trigger</literal> to trigger
|
||||
the watchdog action. See
|
||||
<citerefentry><refentrytitle>systemd.service</refentrytitle><manvolnum>5</manvolnum></citerefentry> for
|
||||
information about the watchdog behavior. </para></listitem>
|
||||
</varlistentry>
|
||||
|
||||
<varlistentry>
|
||||
<term>WATCHDOG_USEC=…</term>
|
||||
|
||||
|
@ -3742,6 +3742,16 @@ static bool service_notify_message_authorized(Service *s, pid_t pid, char **tags
|
||||
return true;
|
||||
}
|
||||
|
||||
static void service_force_watchdog(Service *s) {
|
||||
if (!UNIT(s)->manager->service_watchdogs)
|
||||
return;
|
||||
|
||||
log_unit_error(UNIT(s), "Watchdog request (last status: %s)!",
|
||||
s->status_text ? s->status_text : "<unset>");
|
||||
|
||||
service_enter_signal(s, SERVICE_STOP_WATCHDOG, SERVICE_FAILURE_WATCHDOG);
|
||||
}
|
||||
|
||||
static void service_notify_message(
|
||||
Unit *u,
|
||||
const struct ucred *ucred,
|
||||
@ -3888,8 +3898,15 @@ static void service_notify_message(
|
||||
}
|
||||
|
||||
/* Interpret WATCHDOG= */
|
||||
if (strv_find(tags, "WATCHDOG=1"))
|
||||
e = strv_find_startswith(tags, "WATCHDOG=");
|
||||
if (e) {
|
||||
if (streq(e, "1"))
|
||||
service_reset_watchdog(s);
|
||||
else if (streq(e, "trigger"))
|
||||
service_force_watchdog(s);
|
||||
else
|
||||
log_unit_warning(u, "Passed WATCHDOG= field is invalid, ignoring.");
|
||||
}
|
||||
|
||||
e = strv_find_startswith(tags, "WATCHDOG_USEC=");
|
||||
if (e) {
|
||||
|
Loading…
Reference in New Issue
Block a user