在Python中,不使用/ proc文件系统,如何判断给定的PID是否正在运行?

时间:2010-12-29 03:08:26

标签: python linux unix operating-system pid

说我有一个PID,比如555.我想看看那个pid是在运行还是已经完成。我可以检查/ proc /但我在生产环境中无法访问它。什么是最好的方法来做到这一点,没有像打开管道到“ps”那样的hackish?

2 个答案:

答案 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下运行