質問 CPU負荷を記録する方法 と同様に、プロセスのメモリを記録したいと思います。
ログに記録したいプロセスがリモートサーバーで強制終了され、強制終了される直前のCPU負荷とメモリ使用量を調べたい。
[更新]
ステファノパラッツォのすてきな小さなpythonスクリプトと
CPUおよびMemのtop
よりも小さいMichałの1行の出力値。理由がわかりますか?
output top:
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
2312 schXX 20 0 1241m 328m 58m S 100 0.3 11:56.68 MATLAB
出力Stefano Palazzoのpythonスクリプト:
python memlogger.py 2312
%CPU %MEM
76.00 0.20
76.00 0.20
シェルでワンライナーを作成できます。
logpid() { while sleep 1; do ps -p $1 -o pcpu= -o pmem= ; done; }
pid = 123でプロセスを記録するには:
logpid 123
または、ログを表示してファイルに書き込むには:
logpid $$ | tee /tmp/pid.log
他のデータをログに記録する場合は、-o {this}
オプションを変更します。使用可能なパラメーターについては、man ps
セクション「標準形式の仕様」を参照してください。別の時間分解能が必要な場合は、関数logpid()
のsleep {this}
を変更します。
top
統計を正確に追いかけている場合、top
をバッチモードで実行して、後のプロセスのpidを指定できます。入力した場合、このページ( http://www.dedoimedo.com/computers/linux-cool-hacks.html )から例を取り上げます
top -b -d 10 -n 3 >> top-file
「バッチモードでtopを実行します(-b)。遅延(-d)フラグで指定されたように10秒ごとに更新し、合計3回の反復(-n)を行います。出力が送信されます。ファイルに。」 -p
を含めて、後のプロセスのpid
を指定できます。もちろん、これは純粋にCPUとRAMより多くを返しますが、thosフィールドを含みます。たとえば私の場合、top -b -d 10 -n 3 -p 9189 >> ~/top-file
を使用してpid 9189を監視すると次のようになります。
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
9189 pmj27 20 0 1617016 808112 27916 S 0.0 0.3 1:36.63 gedit
この単純なpythonスクリプトは、あなたが望むことをするはずです:
import time
import string
import sys
import commands
def get_cpumem(pid):
d = [i for i in commands.getoutput("ps aux").split("\n")
if i.split()[1] == str(pid)]
return (float(d[0].split()[2]), float(d[0].split()[3])) if d else None
if __== '__main__':
if not len(sys.argv) == 2 or not all(i in string.digits for i in sys.argv[1]):
print("usage: %s PID" % sys.argv[0])
exit(2)
print("%CPU\t%MEM")
try:
while True:
x,y = get_cpumem(sys.argv[1])
if not x:
print("no such process")
exit(1)
print("%.2f\t%.2f" % (x,y))
time.sleep(0.5)
except KeyboardInterrupt:
print
exit(0)
最初に、監視するプログラムのプロセスIDを見つける必要があります。次に、PIDを引数としてスクリプトを実行できます。
python log.py 3912
CPU使用量とRAM使用量を1秒間に2回パーセントで出力します。
%CPU %MEM
0.90 0.40
1.43 0.40
8.21 0.40
...
その後、出力をファイルにリダイレクトして、後でスプレッドシートにインポートし(python log.py 9391 > firefox_log.txt
)、セパレータとしてTab
を選択してデータをスプレッドシートにインポートできます。
Ctrl + Cを押すか、プロセスが強制終了されると、プログラムは終了します。