Python多进程:如何通过PID可靠检测孙进程存活状态?
问题原因
用os.kill(pid, 0)检测PID存活时,当进程被手动kill后可能进入僵尸状态,此时PID并未被系统回收,所以os.kill会返回存在,但实际上进程已经停止运行。而multiprocessing.Process.is_alive()会跟踪子进程的退出状态,所以能正确判断。
可靠检测方法
方法1:读取Linux的/proc文件系统(仅适用于Linux)
Linux系统中,每个活跃进程在/proc目录下有对应的子目录,僵尸进程的状态会标记为Z。我们可以通过读取进程状态文件来判断:
import os def pid_is_alive(pid): try: with open(f"/proc/{pid}/status") as f: for line in f: if line.startswith("State:"): state = line.split()[1] # 排除僵尸进程(Z)和已退出状态 return state not in ("Z", "X") return False except FileNotFoundError: return False
方法2:使用psutil库(跨平台推荐)
psutil是专门用于系统进程管理的库,能准确识别进程状态,包括区分僵尸进程。先安装库:
pip install psutil
然后使用以下代码:
import psutil def pid_is_alive(pid): try: proc = psutil.Process(pid) # 检查进程是否存在且不是僵尸状态 return proc.is_running() and proc.status() != psutil.STATUS_ZOMBIE except psutil.NoSuchProcess: return False
测试验证
替换原代码中的pid_is_alive函数后,手动kill进程时,就能正确识别进程已停止,不会误判僵尸进程为活跃状态。
内容的提问来源于stack exchange,提问作者davegravy
相关产品推荐
相关产品推荐

