bash shell命令与监测的那点事之top
上次我们说到了ps命令,ps命令虽然在收集运行在系统上的进程信息很有用,但是也有不足之处,ps命令只能显示某个特定时间点的信息,如果你想观察频繁换进换出内存的进程的趋势,用ps的命令就不方便了。
而top命令刚好适用于这种场景。top命令跟ps命令相似,能够显示进程的信息,但它是实时显示的。下图是top命令输出截图:
1 top - 16:56:13 up 120 days, 23:37, 3 users, load average: 0.00, 0.00, 0.00 2 Tasks: 389 total, 1 running, 388 sleeping, 0 stopped, 0 zombie 3 Cpu(s): 1.4%us, 0.5%sy, 0.0%ni, 98.0%id, 0.0%wa, 0.0%hi, 0.1%si, 0.0%st 4 Mem: 3924432k total, 3744996k used, 179436k free, 144112k buffers 5 Swap: 2097144k total, 1834356k used, 262788k free, 396948k cached
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
11629 root 20 0 15304 1484 952 R 1.6 0.0 0:04.29 top
输出的第一部分显示了系统的概况:第一行显示了当前的时间、系统的运行时间、登入的用户数以及系统的平均负载。
平均负载有三个值:最近1分钟的、最近5分钟的以及最近15分钟的平均负载。值越大说明平均负载越高,最近1分钟的负载值很高这很正常,因为有时候会有进程突然开始活动,但是如果最近15分钟的平均负载都很高,就说明系统可能有问题了。
第二行显示了概要的进程信息——top命令的输出中的进程叫任务(task):多少进程处于运行、休眠、停止或是僵化状态。
下一行显示了CPu信息。top根据进程的属主(用户还是系统)和进程的状态(运行、空闲、还是等待)将CPU利用率分成几类输出。
紧跟其后的两行说明了系统内存的状态。前行说的是系统的物理内存:总共多少内存,当前用了多少内存,还有多少空闲。后一行说的是同样的信息,不过是针对系统交换空间的状态来说的。
最后一部分是运行中的进程的详细列表——有些列和ps命令输出类似。
- PID:进程的进程号。
- USER:进程的属主名字。
- PR:进程的优先级。
- NI:进程的谦让度值。
- VIRT:进程占用的虚拟内存总值。
- RES:进程占用的物理内存总值。
- SHR:进程和其它进程共享的内存总量。
- S:进程的状态(D代表可中断的休眠状态,R代表在运行的状态,S代表休眠状态,T代表跟踪状态或者停止状态,Z代表僵化状态)。
- %CPU:进程使用的CPU时间比例。
- %MEM:进程使用的内存占可用内存的比例。
- TIME+:自进程启动到目前为止的CPU时间总量。
- COMMAND:进程的命令名称,也就是启动的程序名。
默认情况下,top命令在启动时会按照%CPU值来排序,你可以在top运行时用下面的交互式命令之一来重新排序。每个交互式命令都是单字符,在top命令运行时键入可以改变top的行为。命令如下表所示:
1 | 切换单CPU状态模式和对称处理器模式 |
B | 打开/关闭表中重要数字的加粗显示 |
I | 切换Irix/Solaris模式 |
Z | 设置表的颜色 |
l | 显示/关闭平均负载信息行 |
t | 显示/关闭CPU信息行 |
m | 显示/关闭MEM和SWAP行 |
f | 添加/移除输出中的不同信息列 |
o | 更改信息行的显示顺序 |
F或O | 选择一列来将进程排序 |
<或> | 将排序的行左移或右移一列 |
R | 切换正常排序还是倒序排序 |
H | 显示/关闭显示线程的情况 |
C | 切换显示进程的命令,还是完整的命令行输入 |
i | 切换是否显示空闲进程 |
S | 切换显示累计CPU时间还是相对CPU时间 |
x | 打开/关闭高亮显示排序列 |
y | 打开/关闭高亮显示运行中的任务 |
z | 切换彩色模式还是单色模式 |
b | 打开/关闭x和y的高亮模式 |
u | 显示某个用户的进程 |
n或# | 设置要显示的进程数 |
k | 结束指定的进程(必须是进程属主或是root用户) |
r | 改变指定进程的优先级(必须是进程属主或是root用户) |
d或s | 改变更新的间隔(默认值是3s) |
W | 把当前设置写到一个配置文件中 |
q | 退出top命令 |
结束进程
系统管理员很重要的一个技能就是知道何时以及如何结束一个进程。有时进程挂起了,只要有办法对付一下让进程重新运行或结束就行了。但有时,进程会耗尽CPU而且不释放资源,此时就要kill掉进程了。
Linux沿用了Unix进行进程间通信的方法,在LInux上,进程间通过信号通信,下表列出了信号代表的含义以及名称:
信号 | 名称 | 描述 |
1 | HUP | 挂起 |
2 | INT | 中断 |
3 | QUIT | 结束运行 |
9 | KILL | 无条件终止 |
11 | SEGV | 段错误 |
15 | TERM | 尽可能终止 |
17 | STOP | 无条件停止运行,但不终止 |
18 | TSTP | 停止或暂停,但继续在后台运行 |
19 | CONT | 在STOP或TSTP之后恢复运行 |
kill命令
kill命令可以通过PID给进程发信号。默认情况下,kill命令会向命令行中列出的全部PID发送一个TERM信号,遗憾的是只能用进程号而不能用命令名,所以有时候并不好用。
-s参数支持指定其他信号(用信号名或者信号值)。kill命令不会有任何输出。下面举个栗子:
1 [root@controller ~]# kill -s HUP 8080
它与下面的栗子等价:
1 kill -s 1 8080
killall命令
killall命令非常强大,它支持通过进程名而不是进程号来结束进程。killall命令也支持通配符,这在系统因负载过大而变得很慢时很有用:
killall http*
上面的栗子命令结束了所有以http开头的进程,比如Apache Web服务器的httpd服务。