等到某个过程(知道"pid")结束

Nik*_*iko 15 python linux pid process wait

我有这个:

def get_process():
    pids = []
    process = None
    for i in os.listdir('/proc'):
        if i.isdigit():
            pids.append(i)

    for pid in pids:
        proc = open(os.path.join('/proc', pid, 'cmdline'), 'r').readline()
        if proc == "Something":
            process = pid

    return process          

def is_running(pid):
    return os.path.exists("/proc/%s" % str(pid))
Run Code Online (Sandbox Code Playgroud)

然后我这样做:

process = get_process()
if process == None:
    #do something
else:
    #Wait until the process end
    while is_running(process):
        pass
Run Code Online (Sandbox Code Playgroud)

我认为这不是等待进程终止的最佳方式,必须有一些函数等待或者什么,但我找不到它.

免责声明:该流程不是子流程

Ilm*_*nen 15

我不是一个真正的Python程序员,但显然Python确实有os.waitpid().这应该消耗更少的CPU时间,并提供比尝试以四分之一秒的间隔杀死进程更快的响应.


附录:正如Niko指出的那样,os.waitpid()如果该过程不是当前流程的子项,则可能无效.在这种情况下,使用os.kill(pid, 0)可能确实是最好的解决方案.请注意,通常,调用os.kill()流程有三种可能的结果:

  1. 如果进程存在且属于您,则调用成功.
  2. 如果进程存在,但属于另一个用户时,它抛出一个OSErrorerrno设置属性errno.EPERM.
  3. 如果进程不存在,它抛出一个OSErrorerrno设置属性errno.ESRCH.

因此,为了可靠地检查进程是否存在,您应该执行类似的操作

def is_running(pid):        
    try:
        os.kill(pid, 0)
    except OSError as err:
        if err.errno == errno.ESRCH:
            return False
    return True
Run Code Online (Sandbox Code Playgroud)