Add mechanism to restart programs
This commit is contained in:
		
							parent
							
								
									1ff8b24650
								
							
						
					
					
						commit
						b626776876
					
				| 
						 | 
					@ -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;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
		Reference in New Issue