return r;
}
- if (kill(pid, 0) < 0 && errno != EPERM) {
+ if (!pid_is_alive(pid)) {
if (may_warn)
- log_info_unit(UNIT(s)->id,
- "PID "PID_FMT" read from file %s does not exist.",
- pid, s->pid_file);
+ log_info_unit(UNIT(s)->id, "PID "PID_FMT" read from file %s does not exist or is a zombie.", pid, s->pid_file);
+
return -ESRCH;
}
return r;
}
- if (pid_valid(s->main_pid) &&
+ if (pid_is_unwaited(s->main_pid) &&
((s->deserialized_state == SERVICE_START && IN_SET(s->type, SERVICE_FORKING, SERVICE_DBUS, SERVICE_ONESHOT, SERVICE_NOTIFY)) ||
IN_SET(s->deserialized_state,
SERVICE_START, SERVICE_START_POST,
return r;
}
- if (pid_valid(s->control_pid) &&
+ if (pid_is_unwaited(s->control_pid) &&
IN_SET(s->deserialized_state,
SERVICE_START_PRE, SERVICE_START, SERVICE_START_POST,
SERVICE_RELOAD,
/* If it's an alien child let's check if it is still
* alive ... */
if (s->main_pid_alien && s->main_pid > 0)
- return kill(s->main_pid, 0) >= 0 || errno != ESRCH;
+ return pid_is_alive(s->main_pid);
/* .. otherwise assume we'll get a SIGCHLD for it,
* which we really should wait for to collect exit
return;
}
- if (s->notify_access == NOTIFY_MAIN && s->main_pid != 0 && pid != s->main_pid) {
- log_warning_unit(u->id,
- "%s: Got notification message from PID "PID_FMT", but reception only permitted for PID "PID_FMT,
- u->id, pid, s->main_pid);
+ if (s->notify_access == NOTIFY_MAIN && pid != s->main_pid) {
+
+ if (s->main_pid != 0)
+ log_warning_unit(u->id, "%s: Got notification message from PID "PID_FMT", but reception only permitted for main PID "PID_FMT, u->id, pid, s->main_pid);
+ else
+ log_debug_unit(u->id, "%s: Got notification message from PID "PID_FMT", but reception only permitted for main PID which is currently not known", u->id, pid);
return;
}