我想知道Linux上单个进程的CPU和内存使用情况——我知道PID。希望我每秒钟都能得到它,并使用'watch'命令将其写入CSV。我可以使用什么命令从Linux命令行中获得这些信息?


当前回答

使用pidstat(来自sysstat -参考链接)。

例如,每5秒监控这两个进程id(12345和11223)的使用情况

$ pidstat -h -r -u -v -p 12345,11223 5

其他回答

正如上面caf的回答中所评论的那样,ps和在某些情况下pidstat将为您提供pCPU的生命周期平均值。 要获得更准确的结果,请使用top。如果你需要跑到顶部,你可以跑:

top -b -n 1 -p <PID>

或者仅用于进程数据和报头:

top -b -n 1 -p <PID> | tail -3 | head -2

没有头文件:

top -b -n 1 -p <PID> | tail -2 | head -1

根据这个答案,我们可以通过收集N个样本,采样周期为T来估计特定进程在特定时间内的平均CPU和内存利用率,如下所示:

N=3;
T=1;
PROCESS_NAME="my_proc";

top -b -c -n $(let tmp=N+1; echo $tmp) -d ${T} -p $(pgrep ${PROCESS_NAME}) | 
grep ${PROCESS_NAME} |  
tee /var/tmp/foo.log |
tail -n +2 | 
awk -v N=$N 'BEGIN{
                c=0; 
                m=0
            }{
                c=c+$9; 
                m=m+$10
            }END{
                printf("%s %s\n", c/N, m/N) 
            }';

为了能够计算结果,我们将top的输出收集到/var/tmp/foo.log文件中。预期输出是这样的:

2.33333 6.9

以及日志文件的内容:

196918 root      20   0   24.4g   1.3g 113872 S   0.0   6.9  39:58.15 my_proc
196918 root      20   0   24.4g   1.3g 113872 S   2.0   6.9  39:58.17 my_proc
196918 root      20   0   24.4g   1.3g 113872 S   3.0   6.9  39:58.20 my_proc
196918 root      20   0   24.4g   1.3g 113872 S   2.0   6.9  39:58.22 my_proc

注意,我们忽略了top命令的第一次执行(tail -n +2)。

(如果你使用的是MacOS 10.10,试试top的cumulative -c选项:

top -c a -pid PID

(此选项在其他linux中不可用,尝试使用Scientific linux el6和RHEL6)

对于那些纠结了一段时间,想知道为什么选定的答案不管用的人:

ps -p <pid> -o %cpu,%mem

%cpu和%mem之间没有空格。

要获得应用程序的内存使用情况(而不是它使用的共享库),需要使用Linux smaps接口。这个答案很好地解释了这一点。