mirror of
https://github.com/systemd/systemd-stable.git
synced 2025-03-08 20:58:20 +03:00
core: fix race condition during startup of a service with ExitType=cgroup
This commit allows service_sigchld_event() is executed before service_dispatch_exec_io(), which might happen when a main process exits very quickly. Also do not check PID for service goodness because the main process have already been exited in this case. Fix: #27919 (cherry picked from commit ef4300654e70e76ed74f7d544e0f44c5d92fb698)
This commit is contained in:
parent
ef5a65a41f
commit
ead40508d7
@ -2102,7 +2102,7 @@ static bool service_good(Service *s) {
|
||||
main_pid_ok = main_pid_good(s);
|
||||
if (main_pid_ok > 0) /* It's alive */
|
||||
return true;
|
||||
if (main_pid_ok == 0) /* It's dead */
|
||||
if (main_pid_ok == 0 && s->exit_type == SERVICE_EXIT_MAIN) /* It's dead */
|
||||
return false;
|
||||
|
||||
/* OK, we don't know anything about the main PID, maybe
|
||||
@ -3714,7 +3714,12 @@ static void service_sigchld_event(Unit *u, pid_t pid, int code, int status) {
|
||||
default:
|
||||
assert_not_reached();
|
||||
}
|
||||
}
|
||||
} else if (s->exit_type == SERVICE_EXIT_CGROUP && s->state == SERVICE_START)
|
||||
/* If a main process exits very quickly, this function might be executed
|
||||
* before service_dispatch_exec_io(). Since this function disabled IO events
|
||||
* to monitor the main process above, we need to update the state here too.
|
||||
* Let's consider the process is successfully launched and exited. */
|
||||
service_enter_start_post(s);
|
||||
}
|
||||
|
||||
} else if (s->control_pid == pid) {
|
||||
|
Loading…
x
Reference in New Issue
Block a user