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

时间:2011-10-04 19:41:08

标签: python linux process wait pid

我有这个:

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))

然后我这样做:

process = get_process()
if process == None:
    #do something
else:
    #Wait until the process end
    while is_running(process):
        pass

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

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

4 个答案:

答案 0 :(得分:12)

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


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

  1. 如果进程存在且属于您,则呼叫成功。
  2. 如果该进程存在但属于另一个用户,则会抛出OSError errno属性设置为errno.EPERM
  3. 如果该进程不存在,则会将OSError属性设置为errno.ESRCH,从而抛出errno
  4. 因此,为了可靠地检查进程是否存在,您应该执行类似

    的操作
    def is_running(pid):        
        try:
            os.kill(pid, 0)
        except OSError as err:
            if err.errno == errno.ESRCH:
                return False
        return True
    

答案 1 :(得分:1)

import time,然后使用time.sleep(#)

import time
process = get_process()
if process == None:
    #do something
else:
    #Wait until the process end
    while is_running(process):
        time.sleep(0.25)

我在我的几篇文章中也有完全相同的功能来阅读/proc/#/cmdline以检查PID。

答案 2 :(得分:1)

答案 3 :(得分:0)

使用Python执行此操作的一种简单可靠的方法是,使用psutil获取PID列表,然后检查您的PID是否在该运行的PID列表中:

import psutil

def check_pid(pid):

    if int(pid) in psutil.pids(): ## Check list of PIDs
        return True ## Running
    else:
        return False ## Not Running

要使用它,只需在一个简单的while循环中运行它即可。

pid = 1000
running = True

while running == True:
    running = check_pid(int(pid))
    (Do stuff *until* PID ends)

(Do stuff *after* PID ends)

或者您可以将所有功能整合到一个函数中...

def pause_while_running(pid):

    running = True

    while running:
        if int(pid) not in psutil.pids():
            running = False
        time.sleep(5)

并使用类似

pause_while_running(pid)
(do stuff after PID ended)