daemon(8): Don't block SIGTERM during restart delay

I believe this was introduced in the original '-r' commit, r231911 (2012).
At the time, the scope was limited to a 1 second sleep.  r332518 (2018)
added '-R', which increased the potential duration of the affected interval
(from 1 to N seconds) by permitting arbitrary restart intervals.

Instead, handle SIGTERM normally during restart-sleep, when the monitored
process is not running, and shut down promptly.

(I noticed this behavior when debugging a child process that exited quickly
under the 'daemon -r -R 30' environment.  'kill <daemonpid>' had no
immediate effect and the monitor process slept until the next restart
attempt.  This was annoying.)

Reviewed by:	allanjude, imp, markj
Differential Revision:	https://reviews.freebsd.org/D20509
This commit is contained in:
Conrad Meyer 2019-06-04 16:07:01 +00:00
parent b734222edd
commit 09a3675d96
Notes: svn2git 2020-12-20 02:59:44 +00:00
svn path=/head/; revision=348629

View File

@ -359,12 +359,13 @@ main(int argc, char *argv[])
}
}
}
if (restart && !terminate)
daemon_sleep(restart, 0);
if (sigprocmask(SIG_BLOCK, &mask_term, NULL)) {
warn("sigprocmask");
goto exit;
}
if (restart && !terminate) {
daemon_sleep(restart, 0);
close(pfd[0]);
pfd[0] = -1;
goto restart;
@ -384,7 +385,8 @@ static void
daemon_sleep(time_t secs, long nsecs)
{
struct timespec ts = { secs, nsecs };
while (nanosleep(&ts, &ts) == -1) {
while (!terminate && nanosleep(&ts, &ts) == -1) {
if (errno != EINTR)
err(1, "nanosleep");
}