Add mechanism to restart programs

This commit is contained in:
Laurence Withers 2008-07-26 16:58:16 +00:00
parent 1ff8b24650
commit b626776876
1 changed files with 41 additions and 3 deletions

View File

@ -7,6 +7,14 @@
/* DEFAULT_RESTART_INTERVAL
* The default argument to --restart-interval, in seconds.
*/
#define DEFAULT_RESTART_INTERVAL 10
#define DEFAULT_RESTART_INTERVAL_S "10"
/* usage() /* usage()
* Display the usage info. * Display the usage info.
*/ */
@ -24,6 +32,9 @@ void usage(void)
" STDERR - log to stderr (default)\n" " STDERR - log to stderr (default)\n"
" file path - log to file\n" " file path - log to file\n"
" -p, --pidfile <path> Write PID to file.\n" " -p, --pidfile <path> Write PID to file.\n"
" -R, --restart-interval <i> Sets the length of time between the process\n"
" exiting and being restarted, in seconds (default\n"
" " DEFAULT_RESTART_INTERVAL_S "). May be 0 to restart immediately.\n"
"", stderr); "", stderr);
} }
@ -38,6 +49,7 @@ struct option options[] = {
{ "daemon", no_argument, 0, 'd' }, { "daemon", no_argument, 0, 'd' },
{ "log", required_argument, 0, 'l' }, { "log", required_argument, 0, 'l' },
{ "pidfile", required_argument, 0, 'p' }, { "pidfile", required_argument, 0, 'p' },
{ "restart-interval", required_argument, 0, 'R' },
{ 0, 0, 0, 0 } { 0, 0, 0, 0 }
}; };
@ -46,7 +58,7 @@ struct option options[] = {
/* optstr /* optstr
* The list of short commandline options for getopt(3). Sorted alphabetically, lowercase first. * The list of short commandline options for getopt(3). Sorted alphabetically, lowercase first.
*/ */
const char* optstr = "dhl:p:V"; const char* optstr = "dhl:p:R:V";
@ -56,8 +68,9 @@ const char* optstr = "dhl:p:V";
*/ */
int main(int argc, char* argv[]) int main(int argc, char* argv[])
{ {
const char* log_argument = 0, * pidfile_argument = 0; char* endp;
int daemon = 0; const char* log_argument = 0, * pidfile_argument = 0, * restart_argument = 0;
int daemon = 0, restart_interval = DEFAULT_RESTART_INTERVAL;
/* safety */ /* safety */
close_file_descriptors(); /* leaves stdout etc. open */ close_file_descriptors(); /* leaves stdout etc. open */
@ -72,9 +85,24 @@ int main(int argc, char* argv[])
case 'd': ++daemon; break; case 'd': ++daemon; break;
case 'l': log_argument = optarg; break; case 'l': log_argument = optarg; break;
case 'p': pidfile_argument = optarg; break; case 'p': pidfile_argument = optarg; break;
case 'R': restart_argument = optarg; break;
} }
} }
opts_done: opts_done:
if(restart_argument) {
restart_interval = strtol(restart_argument, &endp, 0);
if(*endp || restart_interval < 0) {
LOG_ANYWHERE("Invalid --restart-interval option `%s'. Must be an integer >= 0.",
restart_argument);
return 1;
}
}
if(optind >= argc) {
LOG_ANYWHERE("Program not specified.");
return 1;
}
/* set up logging */ /* set up logging */
if(!log_argument || !strcmp(log_argument, "STDERR")) { if(!log_argument || !strcmp(log_argument, "STDERR")) {
log_destination_set(log_destination_stderr); log_destination_set(log_destination_stderr);
@ -102,6 +130,16 @@ int main(int argc, char* argv[])
} }
} }
/* run process */
while(1) {
run_program(argv + optind, argc - optind);
if(restart_interval) {
LOG(LOG_NOTICE, "Sleeping for %d seconds.", restart_interval);
safe_sleep_fixed(restart_interval, 0);
}
}
return 0; return 0;
} }