timemaster: ignore failures of non-essential processes.
Assume only the chronyd or ntpd process is essential for synchronization of the system clock and ignore SIGCHLD from other processes. This should provide resiliency against possible bugs in ptp4l or phc2sys that can terminate the processes. Signed-off-by: Miroslav Lichvar <mlichvar@redhat.com>master
parent
395544d117
commit
914ca86b37
31
timemaster.c
31
timemaster.c
|
@ -1035,6 +1035,14 @@ static int script_run(struct script *script)
|
||||||
pid_t pid, *pids;
|
pid_t pid, *pids;
|
||||||
int i, num_commands, status, ret = 0;
|
int i, num_commands, status, ret = 0;
|
||||||
|
|
||||||
|
for (num_commands = 0; script->commands[num_commands]; num_commands++)
|
||||||
|
;
|
||||||
|
|
||||||
|
if (!num_commands) {
|
||||||
|
/* nothing to do */
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
if (create_config_files(script->configs))
|
if (create_config_files(script->configs))
|
||||||
return 1;
|
return 1;
|
||||||
|
|
||||||
|
@ -1050,9 +1058,6 @@ static int script_run(struct script *script)
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
for (num_commands = 0; script->commands[num_commands]; num_commands++)
|
|
||||||
;
|
|
||||||
|
|
||||||
pids = xcalloc(num_commands, sizeof(*pids));
|
pids = xcalloc(num_commands, sizeof(*pids));
|
||||||
|
|
||||||
for (i = 0; i < num_commands; i++) {
|
for (i = 0; i < num_commands; i++) {
|
||||||
|
@ -1065,15 +1070,25 @@ static int script_run(struct script *script)
|
||||||
|
|
||||||
/* wait for one of the blocked signals */
|
/* wait for one of the blocked signals */
|
||||||
while (1) {
|
while (1) {
|
||||||
if (sigwaitinfo(&mask, &info) > 0)
|
if (sigwaitinfo(&mask, &info) < 0) {
|
||||||
break;
|
if (errno == EINTR)
|
||||||
if (errno != EINTR) {
|
continue;
|
||||||
pr_err("sigwaitinfo() failed: %m");
|
pr_err("sigwaitinfo() failed: %m");
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|
||||||
pr_info("received signal %d", info.si_signo);
|
/*
|
||||||
|
* assume only the first process (i.e. chronyd or ntpd) is
|
||||||
|
* essential and continue if other processes terminate
|
||||||
|
*/
|
||||||
|
if (info.si_signo == SIGCHLD && info.si_pid != pids[0]) {
|
||||||
|
pr_info("process %d terminated (ignored)", info.si_pid);
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
pr_info("received signal %d", info.si_signo);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
/* kill all started processes */
|
/* kill all started processes */
|
||||||
for (i = 0; i < num_commands; i++) {
|
for (i = 0; i < num_commands; i++) {
|
||||||
|
|
Loading…
Reference in New Issue