From cb0420bc25b0dab43d3c2cfab4e386f5d57f98cd Mon Sep 17 00:00:00 2001 From: Leah Neukirchen Date: Thu, 6 Jan 2022 17:38:06 +0100 Subject: shut down loggers by closing the pipe, then slaying if necessary --- rvnit.c | 30 ++++++++++++++++++------------ 1 file changed, 18 insertions(+), 12 deletions(-) diff --git a/rvnit.c b/rvnit.c index 39cbdb4..b1911e0 100644 --- a/rvnit.c +++ b/rvnit.c @@ -520,6 +520,7 @@ main() /* kill all of level */ int oneshot = 0; int daemons = 0; + int loggers = 0; for (i = 0; i < MAX_SV; i++) { if (services[i].level != level) @@ -538,10 +539,12 @@ main() kill(services[i].pid, SIGCONT); daemons++; } + if (services[i].name[2] == 'L' && + services[i].pid > 0) { + loggers++; + } } - // XXX figure out logger shutdown - while (oneshot) { int status = 0; int pid = wait(&status); @@ -561,21 +564,22 @@ main() oneshot--; } else if (services[i].name[2] == 'D') { LOG("daemon %s exited with status %d", services[i].name, services[i].status); -// if (services[i].logged) -// close(services[i].logfd[1]); + if (services[i].logged) + close(services[i].logfd[1]); daemons--; + } else if (services[i].name[2] == 'L') { + LOG("logger %s exited with status %d", services[i].name, services[i].status); + loggers--; } } // only daemons are left, wait up to 7s before sending // them SIGKILL. - if (!daemons) - continue; - int slayed = 0; - while (daemons) { + while (daemons + loggers) { + LOG("level=%d waiting for %d+%d", level, daemons, loggers); int status = 0; int pid = timedwait(&status, 7); if (pid == 0) { // hit timeout @@ -585,8 +589,7 @@ main() for (i = 0; i < MAX_SV; i++) { if (services[i].level != level) continue; - if (services[i].name[2] == 'D' && - services[i].pid > 0) { + if (services[i].pid > 0) { kill(services[i].pid, SIGKILL); kill(services[i].pid, SIGCONT); } @@ -611,9 +614,12 @@ main() oneshot--; } else if (services[i].name[2] == 'D') { LOG("daemon %s exited with status %d", services[i].name, services[i].status); -// if (services[i].logged) -// close(services[i].logfd[1]); + if (services[i].logged) + close(services[i].logfd[1]); daemons--; + } else if (services[i].name[2] == 'L') { + LOG("logger %s exited with status %d", services[i].name, services[i].status); + loggers--; } } -- cgit 1.4.1