[systemd-devel] [PATCH] core: fix detection of dead process v2.

Yuxuan Shui yshuiv7 at gmail.com
Fri Feb 14 10:42:42 PST 2014


Also I would like to point out that the call to
manager_get_unit_by_pid in manager_dispatch_sigchld would always
receive a NULL since a zombie process always belongs to the root
cgroup.
Regards,
Yuxuan Shui.


On Sat, Feb 15, 2014 at 2:38 AM, Yuxuan Shui <yshuiv7 at gmail.com> wrote:
> Commit 5ba6985b moves the UNIT_VTABLE(u)->sigchld_event before systemd
> actually reap the zombie. Which leads to service_load_pid_file accept
> zombie as a valid pid.
>
> v2: I sent the wrong patch.
> ---
>  src/core/service.c |  3 +++
>  src/shared/util.c  | 25 +++++++++++++++++++++++++
>  src/shared/util.h  |  1 +
>  3 files changed, 29 insertions(+)
>
> diff --git a/src/core/service.c b/src/core/service.c
> index 5129784..64a0670 100644
> --- a/src/core/service.c
> +++ b/src/core/service.c
> @@ -1376,6 +1376,9 @@ static int service_load_pid_file(Service *s, bool may_warn) {
>                  return -ESRCH;
>          }
>
> +        if ('Z' == get_process_state(pid))
> +                return -ESRCH;
> +
>          if (s->main_pid_known) {
>                  if (pid == s->main_pid)
>                          return 0;
> diff --git a/src/shared/util.c b/src/shared/util.c
> index 3482b9b..9d4f3ab 100644
> --- a/src/shared/util.c
> +++ b/src/shared/util.c
> @@ -513,6 +513,31 @@ char *truncate_nl(char *s) {
>          return s;
>  }
>
> +char get_process_state(pid_t pid) {
> +        const char *p;
> +        char state;
> +        int r;
> +        _cleanup_free_ char *line = NULL;
> +
> +        assert(pid >= 0);
> +
> +        p = procfs_file_alloca(pid, "stat");
> +        r = read_one_line_file(p, &line);
> +        if (r < 0)
> +                return r;
> +
> +        p = strrchr(line, ')');
> +        if (!p)
> +                return -EIO;
> +
> +        p++;
> +
> +        if (sscanf(p, " %c", &state) != 1)
> +                return -EIO;
> +
> +        return state;
> +}
> +
>  int get_process_comm(pid_t pid, char **name) {
>          const char *p;
>          int r;
> diff --git a/src/shared/util.h b/src/shared/util.h
> index 9aea3a4..8dede1f 100644
> --- a/src/shared/util.h
> +++ b/src/shared/util.h
> @@ -238,6 +238,7 @@ char *file_in_same_dir(const char *path, const char *filename);
>
>  int rmdir_parents(const char *path, const char *stop);
>
> +char get_process_state(pid_t pid);
>  int get_process_comm(pid_t pid, char **name);
>  int get_process_cmdline(pid_t pid, size_t max_length, bool comm_fallback, char **line);
>  int get_process_exe(pid_t pid, char **name);
> --
> 1.8.5.4
>


More information about the systemd-devel mailing list