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
Miroslav Lichvar 2016-07-14 13:43:48 +02:00 committed by Richard Cochran
parent 395544d117
commit 914ca86b37
1 changed files with 23 additions and 8 deletions

View File

@ -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++) {