add retry option to supervise-daemon
The --retry option for supervise-daemon defines how the supervisor will attempt to stop the child process it is monitoring. It is defined when the supervisor is started since stopping the supervisor just sends a signal to the active supervisor. This fixes #160.
This commit is contained in:
parent
36a0ab9054
commit
17b5cc78d3
@ -36,6 +36,8 @@
|
||||
.Ar pidfile
|
||||
.Fl P , -respawn-period
|
||||
.Ar seconds
|
||||
.Fl R , -retry
|
||||
.Ar arg
|
||||
.Fl r , -chroot
|
||||
.Ar chrootpath
|
||||
.Fl u , -user
|
||||
@ -115,6 +117,9 @@ 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
|
||||
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
|
||||
signal/timeout pairs (like SIGTERM/5).
|
||||
.It Fl r , -chroot Ar path
|
||||
chroot to this directory before starting the daemon. All other paths, such
|
||||
as the path to the daemon, chdir and pidfile, should be relative to the chroot.
|
||||
|
@ -23,6 +23,7 @@ supervise_start()
|
||||
# command_args="this \"is a\" test"
|
||||
# to work properly.
|
||||
eval supervise-daemon --start \
|
||||
${retry:+--retry} $retry \
|
||||
${chroot:+--chroot} $chroot \
|
||||
${pidfile:+--pidfile} $pidfile \
|
||||
${respawn_delay:+--respawn-delay} $respawn_delay \
|
||||
|
@ -159,7 +159,7 @@ rc-update: rc-update.o _usage.o rc-misc.o
|
||||
start-stop-daemon: start-stop-daemon.o _usage.o rc-misc.o rc-schedules.o
|
||||
${CC} ${LOCAL_CFLAGS} ${LOCAL_LDFLAGS} ${CFLAGS} ${LDFLAGS} -o $@ $^ ${LDADD}
|
||||
|
||||
supervise-daemon: supervise-daemon.o _usage.o rc-misc.o
|
||||
supervise-daemon: supervise-daemon.o _usage.o rc-misc.o rc-schedules.o
|
||||
${CC} ${LOCAL_CFLAGS} ${LOCAL_LDFLAGS} ${CFLAGS} ${LDFLAGS} -o $@ $^ ${LDADD}
|
||||
|
||||
service_get_value service_set_value get_options save_options: do_value.o rc-misc.o
|
||||
|
@ -61,12 +61,13 @@ static struct pam_conv conv = { NULL, NULL};
|
||||
#include "queue.h"
|
||||
#include "rc.h"
|
||||
#include "rc-misc.h"
|
||||
#include "rc-schedules.h"
|
||||
#include "_usage.h"
|
||||
#include "helpers.h"
|
||||
|
||||
const char *applet = NULL;
|
||||
const char *extraopts = NULL;
|
||||
const char *getoptstring = "D:d:e:g:I:Kk:m:N:p:r:Su:1:2:" \
|
||||
const char *getoptstring = "D:d:e:g:I:Kk:m:N:p:R:r:Su:1:2:" \
|
||||
getoptstring_COMMON;
|
||||
const struct option longopts[] = {
|
||||
{ "respawn-delay", 1, NULL, 'D'},
|
||||
@ -80,6 +81,7 @@ const struct option longopts[] = {
|
||||
{ "nicelevel", 1, NULL, 'N'},
|
||||
{ "pidfile", 1, NULL, 'p'},
|
||||
{ "respawn-period", 1, NULL, 'P'},
|
||||
{ "retry", 1, NULL, 'R'},
|
||||
{ "chroot", 1, NULL, 'r'},
|
||||
{ "start", 0, NULL, 'S'},
|
||||
{ "user", 1, NULL, 'u'},
|
||||
@ -99,6 +101,7 @@ const char * const longopts_help[] = {
|
||||
"Set a nicelevel when starting",
|
||||
"Match pid found in this file",
|
||||
"Set respawn time period",
|
||||
"Retry schedule to use when stopping",
|
||||
"Chroot to this directory",
|
||||
"Start daemon",
|
||||
"Change the process user",
|
||||
@ -410,6 +413,9 @@ int main(int argc, char **argv)
|
||||
bool stop = false;
|
||||
char *exec = NULL;
|
||||
char *pidfile = NULL;
|
||||
char *retry = NULL;
|
||||
int nkilled;
|
||||
int sig = SIGTERM;
|
||||
char *home = NULL;
|
||||
int tid = 0;
|
||||
pid_t child_pid, pid;
|
||||
@ -534,6 +540,9 @@ int main(int argc, char **argv)
|
||||
pidfile = optarg;
|
||||
break;
|
||||
|
||||
case 'R': /* --retry <schedule>|timeout */
|
||||
retry = optarg;
|
||||
break;
|
||||
case 'r': /* --chroot /new/root */
|
||||
ch_root = optarg;
|
||||
break;
|
||||
@ -605,6 +614,10 @@ int main(int argc, char **argv)
|
||||
"than %d to avoid infinite respawning", applet,
|
||||
respawn_delay * respawn_max);
|
||||
}
|
||||
if (retry)
|
||||
parse_schedule(applet, retry, sig);
|
||||
else
|
||||
parse_schedule(applet, NULL, sig);
|
||||
}
|
||||
|
||||
/* Expand ~ */
|
||||
@ -655,9 +668,13 @@ int main(int argc, char **argv)
|
||||
else
|
||||
i = kill(pid, SIGTERM);
|
||||
if (i != 0)
|
||||
/* We failed to stop something */
|
||||
/* We failed to send the signal */
|
||||
exit(EXIT_FAILURE);
|
||||
|
||||
/* wait for the supervisor to go down */
|
||||
while (kill(pid, 0) == 0)
|
||||
sleep(1);
|
||||
|
||||
/* Even if we have not actually killed anything, we should
|
||||
* remove information about it as it may have unexpectedly
|
||||
* crashed out. We should also return success as the end
|
||||
@ -737,7 +754,10 @@ int main(int argc, char **argv)
|
||||
wait(&i);
|
||||
if (exiting) {
|
||||
syslog(LOG_INFO, "stopping %s, pid %d", exec, child_pid);
|
||||
kill(child_pid, SIGTERM);
|
||||
nkilled = run_stop_schedule(applet, exec, NULL, child_pid,
|
||||
0, false, false);
|
||||
if (nkilled > 0)
|
||||
syslog(LOG_INFO, "killed %d processes", nkilled);
|
||||
} else {
|
||||
sleep(respawn_delay);
|
||||
if (respawn_max > 0 && respawn_period > 0) {
|
||||
|
Loading…
Reference in New Issue
Block a user