Eva*_*ark 7 python linux process
我想知道是否有可能找到PID设置的"命令".当我说命令时,我的意思是你在linux shell中运行命令"top"时在最后一列中看到的内容.当我有一个特定的PID时,我想以某种方式从Python获取这些信息.
任何帮助都会很棒.谢谢.
P S*_*ved 11
请不要/proc在生产代码中使用文件系统.相反,使用明确定义的POSIX接口,例如glibc调用和标准shell命令!让Linux世界更加标准化,真的需要!
通过调用shell命令可以很好地实现所需
ps -p <YOUR PID> -o cmd h
Run Code Online (Sandbox Code Playgroud)
不需要解析!
更不用说从python读取shell命令输出比从文件读取更费力/proc.这使得您的程序更加便携!
查看/proc/$PID/cmdline,然后os.readlink()上/proc/$PID/exe.
/proc/$PID/cmdline不一定是正确的,因为程序可以更改其参数向量,或者它可能不包含完整路径.我目前的流程列表中的三个例子是:
avahi-daemon: chroot helperqmgr -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)如果可执行文件不再在文件系统中,它就会有" ".
此外,作为文本段的程序并不总是您想要的.例如,/proc/$PID/exe从/usr/sbin/postgrey上面的例子来看/usr/bin/perl.所有解释过的脚本都是这种情况(#!).
我决定解析/proc/$PID/cmdline- 获取向量的第一个元素,然后在其中查找空格,并在第一个空格之前获取所有空格.如果那是一个可执行文件 - 我就停在那里.否则我做了一个readlink(2)/proc/$PID/exe并删除(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
Run Code Online (Sandbox Code Playgroud)
最后一行将打印类似['/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
Run Code Online (Sandbox Code Playgroud)