【问题标题】:Python - validate if the process filtered by PID is still runningPython - 验证通过 PID 过滤的进程是否仍在运行
【发布时间】:2020-03-20 23:12:10
【问题描述】:

使用子进程库我确实产生了新进程。

import subprocess
pid = subprocess.Popen(["sleep", "1"]).pid
is_process_running(pid)

这样做的重点是在异步等待中调用脚本并继续程序的工作。 我不想使用调用的相同脚本生成多个子进程,这就是为什么我试图检测具有给定 PID 号的进程是否仍然存在于系统中。

我使用的函数如下所示:

import os
def is_process_running(process_id):
    try:
        os.kill(process_id, 0)
        return True
    except OSError:
        return False

不幸的是,使用子进程库创建的进程可以永远访问。它们的状态是:已失效。因此,我上面写的函数总是返回 True。有什么方法可以检测进程是否被标记为defunct

【问题讨论】:

    标签: python subprocess


    【解决方案1】:

    subprocess.Popen 调用返回的Popen 实例上保持和操作要简单得多。这就是你想要的:

    import subprocess as sp
    import time
    
    def is_process_running(proc):
        return proc.poll() is None
    
    proc = sp.Popen(['sleep', '10'])
    is_process_running(proc) # will return True
    time.sleep(6)
    is_process_running(proc) # still True
    time.sleep(6)
    is_process_running(proc) # will now return False
    

    【讨论】:

    • 感谢您的回答,但情况是我想将 PID 值存储在数据库中,并使用不同的 python 工作人员访问它。我不能将其保留为变量
    • 那么在这种情况下,请查看psutil package。它有很多很好的实用程序来管理进程,包括查询它们的状态和发送信号。
    • 例如:this 应该可以完全解决您的问题。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-06-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-09-11
    相关资源
    最近更新 更多