有没有一种编程方式可以获取ps的输出?

4

我正在对一个Web服务器进行CPU使用率基准测试。我的做法是运行一个进程来向服务器发送请求,然后运行以下Bash脚本来确定CPU使用率:

#! /bin/bash

for (( ;; ))
do

    echo "`python -c 'import time; print time.time()'`, `ps -p $1 -o '%cpu' | grep -vi '%CPU'`"
    sleep 5
done

希望能够在Python中完成此操作,这样我就可以在一个脚本中运行它,而不是必须运行两个脚本。 我似乎找不到任何独立于平台的(或者至少是独立于Linux和Mac OS X的)方法来在Python中获取ps输出,而无需启动另一个进程来运行命令。虽然我可以这样做,但如果有API可以实现这一点,那将非常不错。
有没有办法可以做到这一点,还是我必须启动外部脚本?

1
启动子进程有什么问题吗?这就是你的shell脚本所做的。每次通过循环启动一堆进程,至少3个独立的进程,也许4个。将它们减少到1个有什么问题吗? - S.Lott
我会说5个进程,一个用于回声,第二个用于Python,第三个用于PS,第四个用于grep,第五个用于sleep。 - Xavier Combelle
@S.Lott - 这不是不想启动太多进程的问题,而是Python代码比使用Shell程序更容易让我理解。 - Jason Baker
1
如果启动子进程并不重要,那么或许你应该将其从问题中删除。 - S.Lott
虽然另一个问题是针对Linux的。 - 200_success
4个回答

3
我的偏好是这样做。 collection.sh
for (( ;; ))
do
    date; ps -p $1 -o '%cpu'
done

在您“向服务器发送请求”的同时,运行collection.sh >someFile

然后在服务器被攻击后停止collection.sh操作。 最后,您将拥有一个包含日期时间戳和CPU值的日志文件。

analysis.py

import datetime
with( "someFile", "r" ) as source:
    for line in source:
        if line.strip() == "%CPU": continue
        try:
            date= datetime.datetime.strptime( line, "%a %b %d %H:%M:%S %Z %Y" )
        except ValueError:
            cpu= float(line)
            print date, cpu # or whatever else you want to do with this data.

3
你可以查看关于使用Python解析ps输出的这个问题。
其中一个答案建议使用PSI Python模块。但它是一个扩展,所以我不知道它是否适合你。
问题中还展示了如何使用Python调用ps子进程 :)

1

如果您不想调用PS,那么为什么不尝试使用/proc文件系统呢?我认为您可以编写Python程序并从/proc文件系统中读取文件,提取所需的数据。我使用Perl完成了这个过程,通过在Perl脚本中编写内联C代码。我认为您也可以在Python中找到类似的方法。我认为这是可行的,但您需要浏览/proc文件系统,并找出您想要的内容以及如何获取它。 http://www.faqs.org/docs/kernel/x716.html 上述网址可能会给您一些初始推动。


1
问题在于它是针对Linux特定的。它在OS X上无法工作。 - Jason Baker

1
您可以使用PySNMP查询CPU使用率。这样做的额外好处是可以从远程计算机上进行测量。此外,您还可以安装Zenoss或类似软件的VM,让它为您进行监控。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接