summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorian <ian@FreeBSD.org>2015-08-23 20:39:19 +0000
committerian <ian@FreeBSD.org>2015-08-23 20:39:19 +0000
commitba6c7e724c9b214645bae692d2941e12a3f1ded1 (patch)
treee1479d8354434359f8fa9c410776eb67b04460a4
parentd958a69ae31c2077009bd7d87b6d35829ac64f27 (diff)
downloadFreeBSD-src-ba6c7e724c9b214645bae692d2941e12a3f1ded1.zip
FreeBSD-src-ba6c7e724c9b214645bae692d2941e12a3f1ded1.tar.gz
MFC r286947: Add a new exit-timeout option to watchdogd.
-rw-r--r--usr.sbin/watchdogd/watchdogd.818
-rw-r--r--usr.sbin/watchdogd/watchdogd.c16
2 files changed, 26 insertions, 8 deletions
diff --git a/usr.sbin/watchdogd/watchdogd.8 b/usr.sbin/watchdogd/watchdogd.8
index df87a96..5f4b68a 100644
--- a/usr.sbin/watchdogd/watchdogd.8
+++ b/usr.sbin/watchdogd/watchdogd.8
@@ -27,7 +27,7 @@
.\"
.\" $FreeBSD$
.\"
-.Dd October 18, 2014
+.Dd May 11, 2015
.Dt WATCHDOGD 8
.Os
.Sh NAME
@@ -46,6 +46,7 @@
.Op Fl s Ar sleep
.Op Fl t Ar timeout
.Op Fl T Ar script_timeout
+.Op Fl x Ar exit_timeout
.Sh DESCRIPTION
The
.Nm
@@ -103,14 +104,25 @@ defaults to the value specified by the
.Fl s Ar sleep
option.
.Pp
+The
+.Fl x Ar exit_timeout
+argument is the timeout period (in seconds) to leave in effect when the
+program exits.
+Using
+.Fl x
+with a non-zero value protects against lockup during a reboot by
+triggering a hardware reset if the software reboot doesn't complete
+before the given timeout expires.
+.Pp
Upon receiving the
.Dv SIGTERM
or
.Dv SIGINT
signals,
.Nm
-will first instruct the kernel to no longer perform watchdog checks and then
-will terminate.
+will terminate, after first instructing the kernel to either disable the
+timeout or reset it to the value given by
+.Fl x Ar exit_timeout .
.Pp
The
.Nm
diff --git a/usr.sbin/watchdogd/watchdogd.c b/usr.sbin/watchdogd/watchdogd.c
index 5fd16f5..c63d3cd 100644
--- a/usr.sbin/watchdogd/watchdogd.c
+++ b/usr.sbin/watchdogd/watchdogd.c
@@ -77,6 +77,7 @@ static int debugging = 0;
static int end_program = 0;
static const char *pidfile = _PATH_VARRUN "watchdogd.pid";
static u_int timeout = WD_TO_128SEC;
+static u_int exit_timeout = WD_TO_NEVER;
static u_int pretimeout = 0;
static u_int timeout_sec;
static u_int passive = 0;
@@ -461,10 +462,10 @@ watchdog_onoff(int onoff)
/* pat one more time for good measure */
return watchdog_patpat((timeout|WD_ACTIVE));
} else {
- return watchdog_patpat(0);
+ return watchdog_patpat(exit_timeout);
}
failsafe:
- watchdog_patpat(0);
+ watchdog_patpat(exit_timeout);
return (error);
}
@@ -476,8 +477,8 @@ usage(void)
{
if (is_daemon)
fprintf(stderr, "usage:\n"
-" watchdogd [-dnSw] [-e cmd] [-I file] [-s sleep] [-t timeout]\n"
-" [-T script_timeout]\n"
+" watchdogd [-dnSw] [-e cmd] [-I pidfile] [-s sleep] [-t timeout]\n"
+" [-T script_timeout] [-x exit_timeout]\n"
" [--debug]\n"
" [--pretimeout seconds] [-pretimeout-action action]\n"
" [--softtimeout] [-softtimeout-action action]\n"
@@ -697,7 +698,7 @@ parseargs(int argc, char *argv[])
is_daemon = 1;
if (is_daemon)
- getopt_shortopts = "I:de:ns:t:ST:w?";
+ getopt_shortopts = "I:de:ns:t:ST:wx:?";
else
getopt_shortopts = "dt:?";
@@ -741,6 +742,11 @@ parseargs(int argc, char *argv[])
case 'w':
do_timedog = 1;
break;
+ case 'x':
+ exit_timeout = parse_timeout_to_pow2ns(c, NULL, optarg);
+ if (exit_timeout != 0)
+ exit_timeout |= WD_ACTIVE;
+ break;
case 0:
lopt = longopts[longindex].name;
if (!strcmp(lopt, "pretimeout")) {
OpenPOWER on IntegriCloud