From 1b5a3b4ef4b2c3e20cfe4a71cf38c63279ed42d2 Mon Sep 17 00:00:00 2001 From: William Hubbs Date: Fri, 30 Nov 2018 17:10:47 -0600 Subject: [PATCH] supervise-daemon: make respawn-max and respawn-period independent settings --- man/supervise-daemon.8 | 15 +++++++++------ src/rc/supervise-daemon.c | 34 ++++++++++++++++------------------ 2 files changed, 25 insertions(+), 24 deletions(-) diff --git a/man/supervise-daemon.8 b/man/supervise-daemon.8 index 1bf19de0..789c6867 100644 --- a/man/supervise-daemon.8 +++ b/man/supervise-daemon.8 @@ -107,16 +107,19 @@ Data can be from 0 to 7 inclusive. .It Fl k , -umask Ar mode Set the umask of the daemon. .It Fl m , -respawn-max Ar count -Sets the maximum number of times a daemon will be respawned during a -respawn period. If a daemon dies more than this number of times during a -respawn period, +Sets the maximum number of times a daemon will be respawned. If a daemon +crashes more than this number of times, .Nm -will give up trying to respawn it and exit. The default is 10, and 0 -means unlimited. +will give up and exit. The default is 10 and 0 means unlimited. +.Pp +If respawn-period is also set, more than respawn-max crashes must occur +during respawn-period seconds to cause +.Nm +to give up and exit. .It Fl N , -nicelevel Ar level Modifies the scheduling priority of the daemon. .It Fl P , -respawn-period Ar seconds -Sets the length of a respawn period. The default is 10 seconds. See the +Sets the length of a respawn period. See the description of --respawn-max for more information. .It Fl R , -retry Ar timeout | Ar signal Ns / Ns Ar timeout The retry specification can be either a timeout in seconds or multiple diff --git a/src/rc/supervise-daemon.c b/src/rc/supervise-daemon.c index bfbb85f6..d93d31f8 100644 --- a/src/rc/supervise-daemon.c +++ b/src/rc/supervise-daemon.c @@ -143,7 +143,7 @@ static pid_t child_pid; static int respawn_count = 0; static int respawn_delay = 0; static int respawn_max = 10; -static int respawn_period = 5; +static int respawn_period = 0; static char *fifopath = NULL; static int fifo_fd = 0; static char *pidfile = NULL; @@ -563,23 +563,21 @@ static void supervisor(char *exec, char **argv) do_healthcheck = 0; healthcheck_respawn = 0; alarm(0); - if (respawn_max > 0 && respawn_period > 0) { - respawn_now = time(NULL); - if (first_spawn == 0) - first_spawn = respawn_now; - if (respawn_now - first_spawn > respawn_period) { - respawn_count = 0; - first_spawn = 0; - } else - respawn_count++; - if (respawn_count > respawn_max) { - syslog(LOG_WARNING, - "respawned \"%s\" too many times, exiting", exec); - exiting = 1; - continue; - } + respawn_now = time(NULL); + if (first_spawn == 0) + first_spawn = respawn_now; + if ((respawn_period > 0) + && (respawn_now - first_spawn > respawn_period)) { + respawn_count = 0; + first_spawn = 0; + } else + respawn_count++; + if (respawn_max > 0 && respawn_count > respawn_max) { + syslog(LOG_WARNING, "respawned \"%s\" too many times, exiting", + exec); + exiting = 1; + continue; } - alarm(0); ts.tv_sec = respawn_delay; ts.tv_nsec = 0; nanosleep(&ts, NULL); @@ -930,7 +928,7 @@ int main(int argc, char **argv) 0, false, true) > 0) eerrorx("%s: %s is already running", applet, exec); - if (respawn_delay * respawn_max > respawn_period) + if (respawn_period > 0 && respawn_delay * respawn_max > respawn_period) ewarn("%s: Please increase the value of --respawn-period to more " "than %d to avoid infinite respawning", applet, respawn_delay * respawn_max);