5

假设我有一个 PID,例如 555。我想查看该 pid 是否正在运行或已完成。我可以检查 /proc/ 但我无法在我的生产环境中访问它。除了像打开管道到“ps”这样的黑客行为之外,最好的方法是什么?

4

2 回答 2

11

使用os.kill()信号号为 0 的函数。如果进程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的有效性。

于 2010-12-29T03:11:17.290 回答
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 下运行,则不需要这样做。

于 2011-04-04T12:36:36.350 回答