diff options
author | Sergey Poznyakoff <gray@gnu.org> | 2018-05-20 10:53:30 +0300 |
---|---|---|
committer | Sergey Poznyakoff <gray@gnu.org> | 2018-05-20 10:53:30 +0300 |
commit | ddb46c6aa42ada061e51c635c0230e4dc8eab881 (patch) | |
tree | b003ae6af354f553207981b4fc281e8f9e19c60e /src/genrc.c | |
parent | ed8389beadb7cf1f8d95fe7addbc9ff2783f4d07 (diff) | |
download | genrc-ddb46c6aa42ada061e51c635c0230e4dc8eab881.tar.gz genrc-ddb46c6aa42ada061e51c635c0230e4dc8eab881.tar.bz2 |
Sentinel mode: restart the program on certain conditions
* Makefile.am: Create the ChangeLog file from git log.
* configure.ac: Request git2chg
* src/com_start.c: Use sigaction instead of signal.
* src/genrc.8: Document new options.
* src/genrc.c: New options --restart-on-exit and --restart-on-signal.
* src/genrc.h (str_to_sig, str_to_int): New prototypes.
(add_restart_condition): New prototype.
* src/sentinel.c (restart_on, add_restart_condition):
(check_failure_rate): New functions.
(wait_loop): Return if restart is requested.
(sentinel): Restart the program if needed.
Diffstat (limited to 'src/genrc.c')
-rw-r--r-- | src/genrc.c | 41 |
1 files changed, 34 insertions, 7 deletions
diff --git a/src/genrc.c b/src/genrc.c index ae3070d..9052987 100644 --- a/src/genrc.c +++ b/src/genrc.c @@ -27,3 +27,5 @@ enum { OPT_SIGNAL_STOP, - OPT_CREATE_PIDFILE + OPT_CREATE_PIDFILE, + OPT_RESTART_ON_EXIT, + OPT_RESTART_ON_SIGNAL, }; @@ -47,2 +49,4 @@ struct option longopts[] = { { "group", required_argument, 0, 'g' }, + { "restart-on-exit", required_argument, 0, OPT_RESTART_ON_EXIT }, + { "restart-on-signal", required_argument, 0, OPT_RESTART_ON_SIGNAL }, { NULL } @@ -129,5 +133,4 @@ is_numeric_str(char const *s) int -sig_name_to_str(char const *s) +str_to_int(char const *s) { - if (is_numeric_str(s)) { char *end; @@ -139,2 +142,9 @@ sig_name_to_str(char const *s) return n; +} + +int +str_to_sig(char const *s) +{ + if (is_numeric_str(s)) { + return str_to_int(s); } else { @@ -185,4 +195,2 @@ char const *help_msg[] = { " terminate", - " --sentinel PROGRAM runs in foreground; disconnect from the", - " controlling terminal, run it and act as a sentinel", " -P, --pid-from=SOURCE where to look for PIDs of the running programs", @@ -196,2 +204,13 @@ char const *help_msg[] = { "", + "Sentinel mode:", + "", + " --sentinel PROGRAM runs in foreground; disconnect from the", + " controlling terminal, run it and act as a sentinel", + " --restart-on-exit=[!]CODE[,...]", + " restart the program if it exits with one of the", + " listed status codes", + " --restart-on-signal=[!]SIG[,...]", + " restart the program if it terminates on one of the", + " listed signals", + "", "Informational options:", @@ -274,2 +293,4 @@ char const *usage_msg[] = { "[--program=PROGRAM]", + "[--restart-on-exit=[!]CODE[,...]]", + "[--restart-on-signal=[!]SIG[,...]]", "[--sentinel]", @@ -424,2 +445,8 @@ main(int argc, char **argv) break; + case OPT_RESTART_ON_EXIT: + add_restart_condition(RESTART_ON_EXIT, optarg); + break; + case OPT_RESTART_ON_SIGNAL: + add_restart_condition(RESTART_ON_SIGNAL, optarg); + break; case OPT_NO_RELOAD: @@ -452,3 +479,3 @@ main(int argc, char **argv) else if ((p = getenv("GENRC_SIGNAL_RELOAD")) != NULL) { - genrc_signal_reload = sig_name_to_str(p); + genrc_signal_reload = str_to_sig(p); if (genrc_signal_reload == -1) @@ -460,3 +487,3 @@ main(int argc, char **argv) if ((p = getenv("GENRC_SIGNAL_STOP")) != NULL) { - genrc_signal_stop = sig_name_to_str(p); + genrc_signal_stop = str_to_sig(p); if (genrc_signal_stop <= 0) |