0

CPU の使用状況を定期的に追跡する小さなコードがあります。どういうわけか、ファイルを作成しようとすると (「wb」または「w」モード)、ファイルは作成されますが、空です。なぜそうなのか、何か考えはありますか?

ファイルハンドラなし:

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 が優れたフレームワークであることは知っていますが、あまり遊んでいない場合は. また、最終的に1秒あたりのメモリとCPUの使用を含むグラフィカル出力があるという事実を考えると、私の問題を解決することもできます。

最終的に、次の形式の出力を探しています。

      %CPU   %MEM 

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

そして最終的には、CPU に対する時間とメモリに対する時間で十分です。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 でより多くの処理を行い、OS コマンドへの依存を減らすようにしてください (ただし、それでも 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 に答える