我有这个:
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
我认为这不是等待进程终止的最佳方式,必须有一些函数等待,但我找不到它。
免责声明:该流程不是子流程
答案 0 :(得分:12)
我不是一个真正的Python程序员,但显然Python确实有os.waitpid()
。这应该消耗更少的CPU时间,并提供比试图以每隔一秒钟的间隔杀死进程更快的响应。
附录:正如Niko指出的那样,如果进程不是当前进程的子进程,则os.waitpid()
可能无效。在这种情况下,使用os.kill(pid, 0)
可能确实是最佳解决方案。请注意,通常,在流程上调用os.kill()
可能会产生三种结果:
OSError
errno
属性设置为errno.EPERM
。OSError
属性设置为errno.ESRCH
,从而抛出errno
。因此,为了可靠地检查进程是否存在,您应该执行类似
的操作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)