有没有办法用Perl或Python获取进程统计信息?

2 投票
3 回答
4836 浏览
提问于 2025-04-15 11:14

有没有办法用Perl或Python来获取进程的统计信息?我们可以专注于Linux系统。

这里有几个问题:我事先不知道进程的PID(进程标识符),但我可以从脚本中直接运行这个进程。比如,我可以很轻松地这样做:

./myscript.pl some/process/I/want/to/get/stats/for

基本上,我至少想知道这个进程的内存使用情况,当然如果能获取更多信息就更好了,比如进程的运行时间、平均CPU使用率等等。

谢谢。

3 个回答

1

一个常见的误解是,读取 /proc 就像读取 /home 一样。其实,/proc 是为了让你通过一次 open() 操作就能获取到20个类似系统调用所能提供的信息。读取它不会污染缓存,不会让无辜的程序陷入分页的麻烦,也不会导致小猫的悲惨命运。

访问 /proc/foo 就是在告诉内核:“给我一些关于 foo 的信息,我可以用任何语言来处理这些信息。”

如果你需要更多关于 /proc/{pid}/ 中内容的细节,可以更新你的问题,我会把这些信息发给你。

2

如果你在使用 fork() 创建子进程,你会知道它的进程ID(PID)。

在父进程中,你可以查看 /proc/<PID/ 这个文件夹里的内容,来检查子进程的内存和CPU使用情况,不过这只能在子进程还在运行的时候查看。

7

你可以看看这个叫做 Proc::ProcessTable 的模块,它能提供系统中进程的很多信息。你只需要调用“fields”这个方法,就能得到每个进程的详细信息列表。

我最近发现了这个模块,它几乎取代了我之前为Linux写的一个杀进程的Perl模块。你可以在这里查看我的脚本 这里

这个模块还可以很容易地扩展,以从ps命令中提取更多信息。例如,'getbycmd' 方法会返回那些命令行调用与传入参数匹配的进程ID列表。然后,你可以通过调用'getdetail'方法,并传入那个PID,来获取特定进程的详细信息,像这样:

my $psTable = Process->new();

# Get list of process owned by 'root'
for my $pid ( $psTable->getbyuser("root") ) {

    $psDetail = $psList->getdetail( $pid );
    # Do something with the psDetail..

}

撰写回答