0

我有一个小代码可以定期跟踪 cpu 的使用情况。不知何故,当我尝试创建文件(“wb”或“w”模式)时,文件被创建但它是空的。知道为什么会这样吗?

W/O 文件处理程序:

import subprocess
import os

MESSAGE = "mpstat -P ALL | awk '{print $4}'"
SLEEP = "sleep 1"

cmds = [MESSAGE, SLEEP]


def runCommands(commands = cmds):
    count =0
    while True:
            for cmd in cmds:
                    count+=1
                    subprocess.call(cmd, shell = True)


runCommands()

使用文件处理程序:

import subprocess
import os

MESSAGE = "mpstat -P ALL | awk '{print $4}'"
SLEEP = "sleep 1"

cmds = [MESSAGE, SLEEP]


def runCommands(commands = cmds):
    count =0
    while True:
         for cmd in cmds:
            count+=1
            with open('cpu_usage.txt', 'w')as f:
                subprocess.call(cmd, stdout = f, shell = True)


runCommands()

mpstat 给出标准输出(不是标准错误)。目标是使用 python 每秒收集 cpu 和内存使用情况,并嵌入应用程序以收集数据并以图形方式输出相同的数据。我知道 psutil 在这方面是一个很好的框架,但如果你没有经常使用它。它也可以解决我的问题,因为最后我有一个图形输出,其中包含每秒内存和 cpu 使用。

最终我正在寻找一个形式为:

      %CPU   %MEM 

      ..      ..
      ..      ..
      ..      ..

最后,时间 vs CPU 和时间 vs 内存就足够了。通过获取 cpu 值,我只是解决这个问题的一步。ps aux似乎不是一个很好的命令来做我需要的事情,尽管它给出的输出类似于我想要的输出。任何想法/想法/建议。

4

1 回答 1

1

当您使用 'w' 参数打开文件时,它每次都会重新创建while,这意味着当您的循环完成时(在您的示例中它不会,但我们假设它会完成) - 文件执行的最后一件事是sleep 1不打印任何内容的命令。使用“a”(附加)标志打开文件,您将在mpstat其中包含所有输出。

请参阅http://docs.python.org/2/tutorial/inputoutput.html#reading-and-writing-files以获取完整参考。

但总的来说,尝试在 Python 中进行更多处理,减少对操作系统命令的依赖,如下所示(尽管我仍然根本不会做 AWK 的东西,但无论如何)。

import subprocess
import os
import time

CPU = "mpstat -P ALL | awk 'NR==4 { print $3 }'"
MEM = "free -m | awk 'NR==3 { print $4 }'"

def runCommands():
    count = 0
    f = open('cpu_usage.txt', 'a')
    while True:
         t = str(int(time.time()))
         cpu = subprocess.check_output(CPU, shell = True).strip()
         mem = subprocess.check_output(MEM, shell = True).strip()

         f.write(' '.join([t, cpu, mem]))
         f.write('\n')
         f.flush()

         time.sleep(1)

runCommands()
于 2013-06-02T19:49:23.590 回答