等到某个过程(知道“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 

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

免责声明:这个过程不是一个孩子的过程

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


附录: Niko指出,如果进程不是当前进程的子进程, os.waitpid()可能不起作用。 在这种情况下,使用os.kill(pid, 0)确实是最好的解决方案。 请注意,一般来说,在进程中调用os.kill()有三种可能的结果:

  1. 如果进程存在并属于您,则调用成功。
  2. 如果进程存在但属于另一个用户,则会抛出一个errno属性设置为errno.EPERMOSError
  3. 如果进程不存在,则会抛出一个errno属性设置为errno.ESRCHOSError

因此,为了可靠地检查一个过程是否存在,你应该这样做

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

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完全相同的功能。

由于该方法只能在linux上运行,对于linux / osx的支持,你可以这样做:

 import time import os def is_running(pid): stat = os.system("ps -p %s &> /dev/null" % pid) return stat == 0 pid = 64463 while is_running(pid): time.sleep(.25) 

编辑 – 根据tMc关于过多进程的评论

引用: 如何检查在Python中是否存在具有给定pid的进程?

这不会使用较少的资源(我没有测试过),而不是在文件系统上列出并打开所有结果的FD?

 import time import os def is_running(pid): try: os.kill(pid, 0) except OSError: return False return True pid = 64463 while is_running(pid): time.sleep(.25)