我有这个:
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()
有三种可能的结果:
errno
属性设置为errno.EPERM
的OSError
。 errno
属性设置为errno.ESRCH
的OSError
。 因此,为了可靠地检查一个过程是否存在,你应该这样做
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)