Package: runit Version: 2.1.2-22 Severity: wishlist Tags: upstream Hi,
currently lxc can't cleanly shutdown a container running runit as its init system, because all it can do to bring about a shutdown is send signals to init (sigpwr by default), and runit requires additional steps to initiate a shutdown. I wrote a trivial patch that should add sigpwr support to runit. Please review it and if you think it's OK, apply it and perhaps submit it to Gerrit for inclusion. Thanks! AndrĂ¡s -- Enter any 11-digit prime number to continue.
diff --git a/runit-2.1.2/man/runit.8 b/runit-2.1.2/man/runit.8 index 6c07cf8..d597fdd 100644 --- a/runit-2.1.2/man/runit.8 +++ b/runit-2.1.2/man/runit.8 @@ -75,6 +75,12 @@ exists and has the execute by owner permission set, .B runit is told to shutdown the system. .P +If +.B runit +receives a PWR signal, +.B runit +is told to shutdown the system. +.P if .B runit receives an INT signal, a ctrl-alt-del keyboard request is triggered. diff --git a/runit-2.1.2/src/runit.c b/runit-2.1.2/src/runit.c index 2bb4794..584207a 100644 --- a/runit-2.1.2/src/runit.c +++ b/runit-2.1.2/src/runit.c @@ -30,6 +30,7 @@ const char * const stage[3] ={ int selfpipe[2]; int sigc =0; int sigi =0; +int sigp =0; void sig_cont_handler (void) { sigc++; @@ -39,6 +40,10 @@ void sig_int_handler (void) { sigi++; write(selfpipe[1], "", 1); } +void sig_pwr_handler (void) { + sigp++; + write(selfpipe[1], "", 1); +} void sig_child_handler (void) { write(selfpipe[1], "", 1); } void sync_if_needed() { @@ -71,6 +76,7 @@ int main (int argc, const char * const *argv, char * const *envp) { sig_block(sig_hangup); sig_block(sig_int); sig_catch(sig_int, sig_int_handler); + sig_catch(sig_pwr, sig_pwr_handler); sig_block(sig_pipe); sig_block(sig_term); @@ -244,7 +250,7 @@ int main (int argc, const char * const *argv, char * const *envp) { sigi =0; sigc++; } - if (sigc && (stat(STOPIT, &s) != -1) && (s.st_mode & S_IXUSR)) { + if ((sigp) || (sigc && (stat(STOPIT, &s) != -1) && (s.st_mode & S_IXUSR))) { int i; /* unlink(STOPIT); */ chmod(STOPIT, 0); @@ -308,7 +314,7 @@ int main (int argc, const char * const *argv, char * const *envp) { switch (pid) { case 0: case -1: - if ((stat(REBOOT, &s) != -1) && (s.st_mode & S_IXUSR)) { + if ((!sigp) && ((stat(REBOOT, &s) != -1) && (s.st_mode & S_IXUSR))) { strerr_warn2(INFO, "system reboot.", 0); sync_if_needed(); reboot_system(RB_AUTOBOOT); diff --git a/runit-2.1.2/src/sig.c b/runit-2.1.2/src/sig.c index 423d18e..9d9d69b 100644 --- a/runit-2.1.2/src/sig.c +++ b/runit-2.1.2/src/sig.c @@ -9,6 +9,7 @@ int sig_cont = SIGCONT; int sig_hangup = SIGHUP; int sig_int = SIGINT; int sig_pipe = SIGPIPE; +int sig_pwr = SIGPWR; int sig_term = SIGTERM; void (*sig_defaulthandler)() = SIG_DFL; diff --git a/runit-2.1.2/src/sig.h b/runit-2.1.2/src/sig.h index 2a3c780..0ced62d 100644 --- a/runit-2.1.2/src/sig.h +++ b/runit-2.1.2/src/sig.h @@ -9,6 +9,7 @@ extern int sig_cont; extern int sig_hangup; extern int sig_int; extern int sig_pipe; +extern int sig_pwr; extern int sig_term; extern void (*sig_defaulthandler)();