You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Ubuntu 18.04下如何用Python通过PID追踪非子进程的退出码

获取非子进程的退出码(Ubuntu 18.04 + Python)

当然可以!在Linux系统(比如你的Ubuntu 18.04)上,我们有几种靠谱的方法来通过PID获取非子进程的退出码,下面给你逐一拆解:

方法1:使用psutil库(最推荐)

psutil是一个强大的跨平台进程管理库,用它来处理这种场景非常直观,不需要折腾底层系统调用。

首先安装它:

pip install psutil

然后写Python代码:

import psutil

def get_exit_code(pid):
    try:
        proc = psutil.Process(pid)
        # 检查进程是否已经终止
        if not proc.is_running():
            return proc.exitcode
        else:
            return None  # 进程还在运行,没有退出码
    except psutil.NoSuchProcess:
        return None  # 进程不存在

# 示例调用
pid = 12345
exit_code = get_exit_code(pid)
if exit_code is not None:
    print(f"进程{pid}的退出码是: {exit_code}")
else:
    print(f"进程{pid}要么还在运行,要么不存在")

这个方法的优点是简洁、易读,而且不需要特殊权限(只要你能访问该进程的信息)。

方法2:读取/proc文件系统(纯Python,无需额外库)

Linux的/proc虚拟文件系统里存储了所有进程的状态信息,我们可以直接读取/proc/[pid]/status文件来获取退出码。

代码示例:

import os

def get_exit_code_from_proc(pid):
    status_path = f"/proc/{pid}/status"
    try:
        with open(status_path, 'r') as f:
            for line in f:
                if line.startswith("ExitCode:"):
                    exit_code = int(line.split()[1])
                    # 注意:如果进程还在运行,ExitCode会是0(特殊值,不是真正的退出码)
                    # 所以需要先检查进程是否存活
                    if is_process_running(pid):
                        return None
                    return exit_code
        return None
    except FileNotFoundError:
        return None  # 进程不存在

def is_process_running(pid):
    # 检查进程是否存活:向进程发送0信号,成功则存活
    try:
        os.kill(pid, 0)
        return True
    except OSError:
        return False

# 示例调用
pid = 12345
exit_code = get_exit_code_from_proc(pid)
if exit_code is not None:
    print(f"进程{pid}的退出码是: {exit_code}")
else:
    print(f"进程{pid}要么还在运行,要么不存在")

这个方法不需要安装额外库,但需要你熟悉/proc文件系统的结构,而且要注意:进程运行时ExitCode字段会显示0,这不是真正的退出码,所以必须先判断进程是否存活。

方法3:使用os.waitpid()(需要特殊权限)

os.waitpid()通常用于等待子进程,但在Linux上,如果你拥有root权限,可以通过添加特殊标志来等待非子进程:

import os
import errno

def get_exit_code_waitpid(pid):
    try:
        # 使用WNOHANG(非阻塞)和__WALL(等待所有进程,不管是不是子进程)
        result = os.waitpid(pid, os.WNOHANG | os.WUNTRACED | os.__WALL)
        if result == (0, 0):
            # 进程还在运行
            return None
        else:
            # 解析退出码:WEXITSTATUS只在进程正常终止时有效
            if os.WIFEXITED(result[1]):
                return os.WEXITSTATUS(result[1])
            else:
                # 进程被信号终止,返回信号编号
                return os.WTERMSIG(result[1])
    except OSError as e:
        if e.errno == errno.ECHILD:
            # 没有权限等待该进程,或者进程不存在
            return None
        raise

注意:这个方法必须以root用户运行,否则会抛出ECHILD错误(因为普通进程只能等待自己的子进程)。所以除非你有root权限,否则不推荐用这个方法。


内容的提问来源于stack exchange,提问作者jchen

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.09 11:02:43