查看Python中是否存在具有给定pid的进程的最简单方法是什么?

时间:2009-06-17 09:12:08

标签: python posix

在POSIX系统中,我想查看给定的进程(例如PID 4356)是否正在运行。如果我能获得有关该过程的元数据会更好。

6 个答案:

答案 0 :(得分:11)

代替os.waitpid,你也可以使用os.kill和信号0:

>>> os.kill(8861, 0)
>>> os.kill(12765, 0)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
OSError: [Errno 3] No such process
>>> 

编辑:更广泛:

import errno
import os

def pid_exists(pid):
    try:
        os.kill(pid, 0)
    except OSError, e:
        return e.errno == errno.EPERM
    else:
        return True

这在我的Linux机器上运行正常。我还没有确认“信号0”实际上是Posix,但它总是适用于我尝试的每个Unix变种。

答案 1 :(得分:4)

在Linux上至少/ proc目录中有你想要的东西。它基本上是来自内核的系统数据,表示为目录和文件。所有数字目录都是进程的详细信息。只需使用基本的python os函数来获取这些数据:

#ls /proc
1      17    18675  25346  26390  28071  28674  28848  28871  29347  590   851   874  906   9621  9655       devices      iomem     modules ...

#ls /proc/1
auxv  cmdline  cwd  environ  exe  fd  maps  mem  mounts  root  stat  statm  status  task  wchan

#cat /proc/1/cmdline
init [3]

答案 2 :(得分:3)

以便携方式,使用psutil(https://github.com/giampaolo/psutil

>>> import psutil, os
>>> psutil.pid_exists(342342)
False
>>> psutil.pid_exists(os.getpid())
True
>>> 

答案 3 :(得分:1)

看看/proc/pid。这仅存在于进程正在运行,并且包含大量信息。

答案 4 :(得分:0)

os.waitpid()可能有所帮助:

try:
    os.waitpid(pid, 0)
except OSError:
    running = False
else:
    running = True

答案 5 :(得分:0)

获取信息的一种方法是:

import commands
output = commands.getstatusoutput("ps -ef | awk '{print $2}' | grep MYPID")

请参阅:http://docs.python.org/library/commands.html

我想:

commands.getoutput(...) 

可用于获取“ps”行上的元数据。由于您使用的是POSIX系统,我想ps(或等效)可用(例如Solaris下的prstat)。