diff options
author | Leah Neukirchen <leah@vuxu.org> | 2022-01-06 17:38:06 +0100 |
---|---|---|
committer | Leah Neukirchen <leah@vuxu.org> | 2022-01-06 17:39:32 +0100 |
commit | cb0420bc25b0dab43d3c2cfab4e386f5d57f98cd (patch) | |
tree | 02d13dd938524a90cc1f0c9eff462b18a1dfc4f0 | |
parent | be63c2741e3e3e2523ab6163511a1078cb73362f (diff) | |
download | rvnit-cb0420bc25b0dab43d3c2cfab4e386f5d57f98cd.tar.gz rvnit-cb0420bc25b0dab43d3c2cfab4e386f5d57f98cd.tar.xz rvnit-cb0420bc25b0dab43d3c2cfab4e386f5d57f98cd.zip |
shut down loggers by closing the pipe, then slaying if necessary
-rw-r--r-- | rvnit.c | 30 |
1 files 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--; } } |