aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--man/supervise-daemon.815
-rw-r--r--src/rc/supervise-daemon.c34
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);