在Python中查找Linux中特定PID的命令

我想知道是否有可能找出PID设置的“命令”。 当我说命令的时候,我的意思是当你在linux shell中运行“top”命令时,在最后一列中看到的内容。 当我有一个特定的PID时,我想从Python获取这些信息。

任何帮助将是伟大的。 谢谢。

Solutions Collecting From Web of "在Python中查找Linux中特定PID的命令"

请不要在生产代码中使用/proc文件系统。 相反,使用定义良好的POSIX接口,如glibc调用和标准shell命令! 使Linux世界更加标准化,这真的需要!

通过调用shell命令可以很好地实现你所需要的

 ps -p <YOUR PID> -o cmd h 

不需要解析!

更不用说从python中读取shell命令的输出不比从/proc的文件读取更多的努力。 这使得你的程序更加便携,无论是!

查看/proc/$PID/cmdline

阅读ps命令并解析其输出。

 ps -p [PID] -o cmd 

应该这样做

/proc/$PID/cmdline查找,然后在/proc/$PID/exe上执行os.readlink()。

/proc/$PID/cmdline不一定是正确的,因为程序可以改变它的参数向量,或者它可能不包含完整的路径。 我目前的进程列表中有三个例子:

  • avahi-daemon: chroot helper
  • qmgr -l -t fifo -u
  • /usr/sbin/postgrey --pidfile=/var/run/postgrey.pid --daemonize --inet=127.0.0.1:60000 --delay=55

第一个很明显 – 这不是一个有效的路径或程序名称。 第二个只是一个没有路径名的可执行文件。 第三个看起来不错,但整个命令行实际上是在argv[0] ,用空格分隔参数。 通常你应该有NUL分隔参数。

所有这些都表明/proc/$PID/cmdline (或ps(1)输出)是不可靠的。

但是,也不是/proc/$PID/exe 。 通常它是可执行文件的符号链接,它是进程的主要文本段。 但是,如果可执行文件不在文件系统中,它有时候会有“ (deleted) ”。

而且,文本段的程序并不总是你想要的。 例如,上面的/usr/sbin/postgrey例子中的/proc/$PID/exe/usr/bin/perl 。 这将是所有解释的脚本(#!)的情况。

我决定解析/proc/$PID/cmdline – 取出矢量的第一个元素,然后在那里寻找空格,并在第一个空格之前全部取出。 如果这是一个可执行文件 – 我停在那里。 否则,我在/proc/$PID/exe上做了readlink(2),并删除了所有“ (deleted) ”字符串。 如果可执行文件名实际上包含空格,则第一部分将失败。 关于这一点你可以做的不多。

BTW。 使用ps(1)而不是/proc/$PID/cmdline不适用于这种情况,因为您要回退到/proc/$PID/exe 。 你将依赖于/proc文件系统,所以你可以用read(2)而不是pipe(2),fork(2),execve(2),readdir(3)…,write(2) ),阅读(2)。 虽然ps和/proc/$PID/cmdline从python代码的角度来看可能是一样的,但是在ps后面还有更多的事情要做。

一个有趣的Python包是psutil 。

例如,要获取特定PID的命令:

 import psutil pid = 1234 # The pid whose info you're looking for p = psutil.Process(pid) print p.cmdline 

最后一行将打印出类似['/usr/bin/python', 'main.py']

一个更健壮的方式来获取这些信息,如果pid代表一个进程不再运行,

 import psutil pid = 1234 # The pid whose info you're looking for if pid in psutil.get_pid_list(): p = psutil.Process(pid) print p.cmdline 

proc文件系统导出这个(和其他)信息。 看看/ proc / PID / cmd符号链接。

这对我工作:

 def filter_non_printable(str): ret="" for c in str: if ord(c) > 31 or ord(c) == 9: ret += c else: ret += " " return ret # # Get /proc/<cpu>/cmdline information # def pid_name(pid): try: with open(os.path.join('/proc/', pid, 'cmdline'), 'r') as pidfile: return filter_non_printable(pidfile.readline()) except Exception: pass return