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


当前回答

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

(您可以省略“cmd”,但这可能有助于调试)。

注意,这给出了进程在运行期间的平均CPU使用率。

其他回答

正如上面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

这里的所有答案都只显示了PID的内存百分比。

下面是一个如何获取所有apache进程的rss内存使用KB的例子,如果你只想查看特定的PID,将“grep apache”替换为“grep PID”:

watch -n5 "ps aux -y | grep apache | awk '{print \$2,\$6}'"

这个打印:

Every 5.0s: ps aux -y | grep apache | awk '{print $2,$6}'                                                                                                                                                                                                          
Thu Jan 25 15:44:13 2018

12588 9328
12589 8700
12590 9392
12591 9340
12592 8700
12811 15200
15453 9340
15693 3800
15694 2352
15695 1352
15697 948
22896 9360

CPU %:

watch -n5 "ps aux -y | grep apache | awk '{print \$2,\$3,\$6}'"

输出:

Every 5.0s: ps aux -y | grep apache | awk '{print $2,$3,$6}'                                                                                                                                                                                                       
Thu Jan 25 15:46:00 2018

12588 0.0 9328
12589 0.0 8700
12590 0.0 9392
12591 0.0 9340
12592 0.0 8700
12811 0.0 15200
15453 0.0 9340
15778 0.0 3800
15779 0.0 2352
15780 0.0 1348
15782 0.0 948
22896 0.0 9360

下面的命令获取特定进程(pid)每40秒CPU和内存使用率的平均值

pidstat 40 -ru -p <pid>

我的案例的输出(前两行为CPU使用率,后两行为内存):

02:15:07 PM       PID    %usr %system  %guest    %CPU   CPU  Command
02:15:47 PM     24563    0.65    0.07    0.00    0.73     3  java

02:15:07 PM       PID  minflt/s  majflt/s     VSZ    RSS   %MEM  Command
02:15:47 PM     24563      6.95      0.00 13047972 2123268   6.52  java

根据这个答案,我们可以通过收集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)。

ps aux | awk '{print $4"\t"$11}' | sort | uniq -c | awk '{print $2" "$1" "$3}' | sort -nr

或者每个进程

ps aux | awk '{print $4"\t"$11}' | sort | uniq -c | awk '{print $2" "$1" "$3}' | sort -nr |grep mysql