Linux
的 top
命令行实用程序显示有关当前活动进程和系统资源的信息。实时查看 Linux
系统正在做什么,可以更轻松地找到使用大量资源的进程或简单地监视负载。例如,我们可以使用top来监控系统或特定进程的运行时间、内存使用情况、CPU负载等信息。
在本教程中,我们将了解如何在 Linux
中使用 top
命令根据进程名称进行关键字过滤过滤进程。
1. 使用内置功能过滤
打开终端,连接上服务器后,使用 top
命令后,大概长这样:
$ top
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
16 root 20 0 0 0 0 R 81.7 0.0 15:53.89 kworker+
1352 root 20 0 7224 1316 704 S 1.0 0.5 0:09.76 Xorg
1373 root -51 0 0 0 0 S 0.7 0.0 0:03.50 irq/132+
现在,让我们按键盘 O
键,这会弹出一个提示,要求我们输入要过滤的字段和值。我们需要过滤的字段是 COMMAND
,而值应该是 nginx
。用等号连接这些字符串,我们筛选出 nginx
过滤器变为 COMMAND=nginx
:
...
add filter #1 (ignoring case) as: [!]FLD?VAL COMMAND=nginx
最后, top
命令现在应该只显示 nginx
进程的统计信息:
top - 11:14:22 up 388 days, 19:11, 1 user, load average: 0.02, 0.06, 0.07
Tasks: 96 total, 1 running, 95 sleeping, 0 stopped, 0 zombie
%Cpu(s): 2.7 us, 0.3 sy, 0.0 ni, 97.0 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st
KiB Mem : 1883564 total, 121584 free, 779648 used, 982332 buff/cache
KiB Swap: 1049596 total, 1049596 free, 0 used. 729816 avail Mem
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
9993 www 20 0 144396 36028 2988 S 0.0 1.9 0:01.11 nginx
9994 www 20 0 129932 6684 740 S 0.0 0.4 0:00.00 nginx
14565 root 20 0 129932 8116 2388 S 0.0 0.4 0:07.38 nginx
可以展示多个服务过滤条件的进程。
2. 使用组合命令实现过滤
可以将 top
命令的 -p
指定进程ID功能和 pgrep
命令结合,获取与关键词 nginx
匹配的目标进程进程监控:
top -c -p $(pgrep -d',' -f nginx)
也能得到想要的结果:
top - 11:24:10 up 388 days, 19:21, 1 user, load average: 0.15, 0.09, 0.08
Tasks: 3 total, 0 running, 3 sleeping, 0 stopped, 0 zombie
%Cpu(s): 3.7 us, 1.0 sy, 0.0 ni, 95.3 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st
KiB Mem : 1883564 total, 100504 free, 792984 used, 990076 buff/cache
KiB Swap: 1049596 total, 1049596 free, 0 used. 713956 avail Mem
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
9993 www 20 0 144396 34912 3012 S 0.0 1.9 0:01.35 nginx: worker process
9994 www 20 0 129932 6684 740 S 0.0 0.4 0:00.01 nginx: cache manager process
14565 root 20 0 129932 8116 2388 S 0.0 0.4 0:07.38 nginx: master process
但是,当我们重新启动一个进程时,它的 PID 会发生变化。因此, top
命令需要重新启动以检索目标进程 PID 的完整列表。为了解决这个问题,我们可以使用一个脚本,按照进程名过滤 top
命令的结果。例如,可以考虑使用下面的 shell
脚本 。
3. 使用shell脚本实时监听
写一个 shell
脚本,我这里命名为 my_top.sh
:
#!/bin/bash
__process_name=$1
while (true)
do
clear
__arg=$(pgrep -d',' -f $__process_name)
if [ -z "$__arg" ]; then
top -c | head -n 5
else
top -c -n 1 -p $__arg
fi
sleep 5
done
解析一下这个脚本,从参数中获取到进程名称,然后使用pgrep -f
去匹配进程ID,如果匹配到,则指定进程ID监听,如果没有,则只显示上面的5行信息也就是服务器负载相关的信息而没有进程;
重要的是,这个脚本每5秒重新获取一次进程ID,这样,当进程重启之后,进程ID改变,脚本还是会实现监听而不需要强制退出后重新匹配。