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
相关产品推荐
相关产品推荐

