Loading init/README.md +2 −0 Original line number Diff line number Diff line Loading @@ -277,6 +277,8 @@ runs the service. CLD_EXITED or an status other than '0', reboot the system with the target specified in _target_. _target_ takes the same format as the parameter to sys.powerctl. This is particularly intended to be used with the `exec_start` builtin for any must-have checks during boot. A service being stopped by init (e.g. using the `stop` or `class_reset` commands) is not considered a failure for the purpose of this setting. `restart_period <seconds>` > If a non-oneshot service exits, it will be restarted at its start time plus Loading init/service.cpp +7 −3 Original line number Diff line number Diff line Loading @@ -194,6 +194,8 @@ void Service::KillProcessGroup(int signal, bool report_oneshot) { << ") process group..."; int max_processes = 0; int r; flags_ |= SVC_STOPPING; if (signal == SIGTERM) { r = killProcessGroupOnce(proc_attr_.uid, pid_, signal, &max_processes); } else { Loading Loading @@ -277,7 +279,8 @@ void Service::Reap(const siginfo_t& siginfo) { f(siginfo); } if ((siginfo.si_code != CLD_EXITED || siginfo.si_status != 0) && on_failure_reboot_target_) { if ((siginfo.si_code != CLD_EXITED || siginfo.si_status != 0) && on_failure_reboot_target_ && !(flags_ & SVC_STOPPING)) { LOG(ERROR) << "Service with 'reboot_on_failure' option failed, shutting down system."; trigger_shutdown(*on_failure_reboot_target_); } Loading @@ -287,7 +290,7 @@ void Service::Reap(const siginfo_t& siginfo) { if (flags_ & SVC_TEMPORARY) return; pid_ = 0; flags_ &= (~SVC_RUNNING); flags_ &= ~(SVC_RUNNING | SVC_STOPPING); start_order_ = 0; // Oneshot processes go into the disabled state on exit, Loading Loading @@ -411,7 +414,8 @@ Result<void> Service::Start() { bool disabled = (flags_ & (SVC_DISABLED | SVC_RESET)); // Starting a service removes it from the disabled or reset state and // immediately takes it out of the restarting state if it was in there. flags_ &= (~(SVC_DISABLED|SVC_RESTARTING|SVC_RESET|SVC_RESTART|SVC_DISABLED_START)); flags_ &= (~(SVC_DISABLED | SVC_RESTARTING | SVC_RESET | SVC_RESTART | SVC_DISABLED_START | SVC_STOPPING)); // Running processes require no additional work --- if they're in the // process of exiting, we've ensured that they will immediately restart Loading init/service.h +1 −0 Original line number Diff line number Diff line Loading @@ -54,6 +54,7 @@ // should not be killed during shutdown #define SVC_TEMPORARY 0x1000 // This service was started by 'exec' and should be removed from the // service list once it is reaped. #define SVC_STOPPING 0x2000 // service is being stopped by init #define NR_SVC_SUPP_GIDS 12 // twelve supplementary groups Loading Loading
init/README.md +2 −0 Original line number Diff line number Diff line Loading @@ -277,6 +277,8 @@ runs the service. CLD_EXITED or an status other than '0', reboot the system with the target specified in _target_. _target_ takes the same format as the parameter to sys.powerctl. This is particularly intended to be used with the `exec_start` builtin for any must-have checks during boot. A service being stopped by init (e.g. using the `stop` or `class_reset` commands) is not considered a failure for the purpose of this setting. `restart_period <seconds>` > If a non-oneshot service exits, it will be restarted at its start time plus Loading
init/service.cpp +7 −3 Original line number Diff line number Diff line Loading @@ -194,6 +194,8 @@ void Service::KillProcessGroup(int signal, bool report_oneshot) { << ") process group..."; int max_processes = 0; int r; flags_ |= SVC_STOPPING; if (signal == SIGTERM) { r = killProcessGroupOnce(proc_attr_.uid, pid_, signal, &max_processes); } else { Loading Loading @@ -277,7 +279,8 @@ void Service::Reap(const siginfo_t& siginfo) { f(siginfo); } if ((siginfo.si_code != CLD_EXITED || siginfo.si_status != 0) && on_failure_reboot_target_) { if ((siginfo.si_code != CLD_EXITED || siginfo.si_status != 0) && on_failure_reboot_target_ && !(flags_ & SVC_STOPPING)) { LOG(ERROR) << "Service with 'reboot_on_failure' option failed, shutting down system."; trigger_shutdown(*on_failure_reboot_target_); } Loading @@ -287,7 +290,7 @@ void Service::Reap(const siginfo_t& siginfo) { if (flags_ & SVC_TEMPORARY) return; pid_ = 0; flags_ &= (~SVC_RUNNING); flags_ &= ~(SVC_RUNNING | SVC_STOPPING); start_order_ = 0; // Oneshot processes go into the disabled state on exit, Loading Loading @@ -411,7 +414,8 @@ Result<void> Service::Start() { bool disabled = (flags_ & (SVC_DISABLED | SVC_RESET)); // Starting a service removes it from the disabled or reset state and // immediately takes it out of the restarting state if it was in there. flags_ &= (~(SVC_DISABLED|SVC_RESTARTING|SVC_RESET|SVC_RESTART|SVC_DISABLED_START)); flags_ &= (~(SVC_DISABLED | SVC_RESTARTING | SVC_RESET | SVC_RESTART | SVC_DISABLED_START | SVC_STOPPING)); // Running processes require no additional work --- if they're in the // process of exiting, we've ensured that they will immediately restart Loading
init/service.h +1 −0 Original line number Diff line number Diff line Loading @@ -54,6 +54,7 @@ // should not be killed during shutdown #define SVC_TEMPORARY 0x1000 // This service was started by 'exec' and should be removed from the // service list once it is reaped. #define SVC_STOPPING 0x2000 // service is being stopped by init #define NR_SVC_SUPP_GIDS 12 // twelve supplementary groups Loading