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

发布于 2024-10-09 05:19:55 字数 103 浏览 7 评论 0原文

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

Say I have a PID, like 555. I want to see if that pid is running or has completed. I can check /proc/ but I don't have access to that in my production environment. What's the best way to do this, short of something hackish like opening a pipe to "ps"?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

说不完的你爱 2024-10-16 05:19:55

使用 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 的有效性。

Use the os.kill() function with a signal number of 0. If the process pid exists, then the call will be successful, else it will raise an OSError exception:

try:
    os.kill(pid, 0)
    print("process exists")
except OSError:
    print("process does not exist")

The documentation for kill(2) on my system says:

The kill() function sends the signal given by sig to pid, a process or a group of processes. Sig may be one of the signals specified in sigaction(2) or it may be 0, in which case error checking is performed but no signal is actually sent. This can be used to check the validity of pid.

野心澎湃 2024-10-16 05:19:55

使用 Greg 提到的 os.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。

Use os.kill() as mentioned by Greg, but realize that the kill system call tests not whether the process exists, but whether you can send a kill to the process. One failure mode is if the process doesn't exist, but another is that you do not have permission to kill it. To differentiate, you have to check the exception:

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

This is not required if you know you are always going to have permission to kill the process you are checking for, say because you are running as root or the process is known to be running under the same UID as the process checking it.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文