如何记录应用程序的内存和CPU使用情况?

与问题类似如何记录CPU负载? ,我想记录一个进程的内存。

我想要记录的进程在远程服务器上被杀死,我想在它被杀死之前找出CPU负载和内存使用情况。

[更新]

Stefano Palazzo的整齐的小python剧本和

Michał的一行输出值小于CPU和Mem的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 

你可以在shell中创建一个单行程:

 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 

您将“以批处理模式(-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 __name__ == '__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使用率:

 %CPU %MEM 0.90 0.40 1.43 0.40 8.21 0.40 ... 

然后,您可以将其输出重定向到文件,以便稍后将其导入电子表格( python log.py 9391 > firefox_log.txt ),并将数据导入电子表格,选择Tab作为分隔符。

按Ctrl + C或进程被终止时程序退出。