说我有一个PID,比如555.我想看看那个pid是在运行还是已经完成。我可以检查/ proc /但我在生产环境中无法访问它。什么是最好的方法来做到这一点,没有像打开管道到“ps”那样的hackish?
答案 0 :(得分:11)
使用信号编号为0的os.kill()
函数。如果进程 pid 存在,则调用将成功,否则将引发OSError
异常:
try:
os.kill(pid, 0)
print("process exists")
except OSError:
print("process does not exist")
我系统上kill(2)
的文档说:
kill ()函数将 sig 给出的信号发送到 pid ,一个进程或一组进程。 Sig 可以是在sigaction(2)中指定的信号之一,或者它可以是0,在这种情况下执行错误检查但实际上没有发送信号。这可用于检查 pid 的有效性。
答案 1 :(得分:2)
使用Greg提到的os.kill()
,但意识到kill系统调用不测试进程是否存在,而是测试是否可以向进程发送kill。一种失败模式是,如果该过程不存在,而另一种失败模式是您没有权限将其杀死。要区分,您必须检查异常:
try:
os.kill(pid, 0)
print 'Process exists and we can kill it'
except OSError, e:
if e.errno == 1:
print 'Process exists, but we cannot kill it'
else:
raise
如果您知道您始终有权终止正在检查的进程,则不需要这样做,例如,因为您以root用户身份运行,或者已知进程在与检查进程相同的UID下运行