psutil.STATUS_DEAD 状态是否与 psutil.STATUS_ZOMBIE 相同?

is psutil.STATUS_DEAD status same as psutil.STATUS_ZOMBIE?

在 python psutil 模块中,我看到进程的两个状态,psutil.STATUS_DEAD psutil.STATUS_ZOMBIE。需要了解两者的区别。我可以使用 'kill -1' 和 'kill -3' 命令模拟 Zombie 进程,但无法模拟 Dead 进程。

这里有什么想法吗?

它们与 'psutil/_commom.py' 中定义的不同:

STATUS_ZOMBIE = "zombie"
STATUS_DEAD = "dead"

但是如果你在5.9.0版本中搜索STATUS_DEAD,你可能会发现它们在某种意义上可能是相同的。

在 'psutil/_psbsd.py' 中表明 STATUS_DEAD 未在任何 BSD 平台中使用

# OPENBSD
        # According to /usr/include/sys/proc.h SZOMB is unused.
        # test_zombie_process() shows that SDEAD is the right
        # equivalent. Also it appears there's no equivalent of
        # psutil.STATUS_DEAD. SDEAD really means STATUS_ZOMBIE.
        # cext.SZOMB: _common.STATUS_ZOMBIE,
        cext.SDEAD: _common.STATUS_ZOMBIE,
        cext.SZOMB: _common.STATUS_ZOMBIE,

在'psutil/_pslinux.py'关于Linux显示:

# See:
# https://github.com/torvalds/linux/blame/master/fs/proc/array.c
# ...and (TASK_* constants):
# https://github.com/torvalds/linux/blob/master/include/linux/sched.h
PROC_STATUSES = {
    "R": _common.STATUS_RUNNING,
    "S": _common.STATUS_SLEEPING,
    "D": _common.STATUS_DISK_SLEEP,
    "T": _common.STATUS_STOPPED,
    "t": _common.STATUS_TRACING_STOP,
    "Z": _common.STATUS_ZOMBIE,
    "X": _common.STATUS_DEAD,
    "x": _common.STATUS_DEAD,
    "K": _common.STATUS_WAKE_KILL,
    "W": _common.STATUS_WAKING,
    "I": _common.STATUS_IDLE,
    "P": _common.STATUS_PARKED,
}

状态对应于linux的任务状态:

// https://github.com/torvalds/linux/blame/master/fs/proc/array.c
static const char * const task_state_array[] = {

    /* states in TASK_REPORT: */
    "R (running)",      /* 0x00 */
    "S (sleeping)",     /* 0x01 */
    "D (disk sleep)",   /* 0x02 */
    "T (stopped)",      /* 0x04 */
    "t (tracing stop)", /* 0x08 */
    "X (dead)",     /* 0x10 */
    "Z (zombie)",       /* 0x20 */
    "P (parked)",       /* 0x40 */

    /* states beyond TASK_REPORT: */
    "I (idle)",     /* 0x80 */
};

因此,linux中的区别就很明显了。 What Is a “Zombie Process” on Linux?

在 psutil 中,如果您使用 psutil.Popen() 创建一个进程 p,然后将其终止。 只要父进程未终止或您未调用 p.wait(),该进程将始终保持 'Zombie' 状态。