process-util: introduce pid_is_my_child() helper
No functional changes.
This commit is contained in:
@@ -934,6 +934,20 @@ int getenv_for_pid(pid_t pid, const char *field, char **ret) {
|
||||
return 0;
|
||||
}
|
||||
|
||||
int pid_is_my_child(pid_t pid) {
|
||||
pid_t ppid;
|
||||
int r;
|
||||
|
||||
if (pid <= 1)
|
||||
return false;
|
||||
|
||||
r = get_process_ppid(pid, &ppid);
|
||||
if (r < 0)
|
||||
return r;
|
||||
|
||||
return ppid == getpid_cached();
|
||||
}
|
||||
|
||||
bool pid_is_unwaited(pid_t pid) {
|
||||
/* Checks whether a PID is still valid at all, including a zombie */
|
||||
|
||||
|
||||
@@ -69,6 +69,7 @@ int getenv_for_pid(pid_t pid, const char *field, char **_value);
|
||||
|
||||
bool pid_is_alive(pid_t pid);
|
||||
bool pid_is_unwaited(pid_t pid);
|
||||
int pid_is_my_child(pid_t pid);
|
||||
int pid_from_same_root_fs(pid_t pid);
|
||||
|
||||
bool is_main_thread(void);
|
||||
|
||||
+2
-5
@@ -2269,7 +2269,7 @@ void unit_prune_cgroup(Unit *u) {
|
||||
|
||||
int unit_search_main_pid(Unit *u, pid_t *ret) {
|
||||
_cleanup_fclose_ FILE *f = NULL;
|
||||
pid_t pid = 0, npid, mypid;
|
||||
pid_t pid = 0, npid;
|
||||
int r;
|
||||
|
||||
assert(u);
|
||||
@@ -2282,15 +2282,12 @@ int unit_search_main_pid(Unit *u, pid_t *ret) {
|
||||
if (r < 0)
|
||||
return r;
|
||||
|
||||
mypid = getpid_cached();
|
||||
while (cg_read_pid(f, &npid) > 0) {
|
||||
pid_t ppid;
|
||||
|
||||
if (npid == pid)
|
||||
continue;
|
||||
|
||||
/* Ignore processes that aren't our kids */
|
||||
if (get_process_ppid(npid, &ppid) >= 0 && ppid != mypid)
|
||||
if (pid_is_my_child(npid) == 0)
|
||||
continue;
|
||||
|
||||
if (pid != 0)
|
||||
|
||||
+2
-6
@@ -143,8 +143,6 @@ static void service_unwatch_pid_file(Service *s) {
|
||||
}
|
||||
|
||||
static int service_set_main_pid(Service *s, pid_t pid) {
|
||||
pid_t ppid;
|
||||
|
||||
assert(s);
|
||||
|
||||
if (pid <= 1)
|
||||
@@ -163,12 +161,10 @@ static int service_set_main_pid(Service *s, pid_t pid) {
|
||||
|
||||
s->main_pid = pid;
|
||||
s->main_pid_known = true;
|
||||
s->main_pid_alien = pid_is_my_child(pid) == 0;
|
||||
|
||||
if (get_process_ppid(pid, &ppid) >= 0 && ppid != getpid_cached()) {
|
||||
if (s->main_pid_alien)
|
||||
log_unit_warning(UNIT(s), "Supervising process "PID_FMT" which is not our child. We'll most likely not notice when it exits.", pid);
|
||||
s->main_pid_alien = true;
|
||||
} else
|
||||
s->main_pid_alien = false;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user