监测程序
探查进程
当程序运行在系统上时,我们称之为进程(process)。想监测这些进程,需要熟悉ps命令的
用法。ps命令好比工具中的瑞士军刀,它能输出运行在系统上的所有程序的许多信息。
遗憾的是,随着它的稳健而来的还有复杂性——有数不清的参数,这或许让ps命令成了最难
掌握的命令。大多数系统管理员在掌握了能提供他们需要信息的一组参数之后,就一直坚持只使
用这组参数。
默认情况下,ps命令并不会提供那么多的信息:.
默认情况下,ps命令只会显示运行在当前控制台下的属于当前用户的进
程。在此例中,我们只运行了bash shell(注意,shell也只是运行在系统上的另一个程序而已)以
及ps命令本身。
上例中的基本输出显示了程序的进程ID(Process ID,PID)、它们运行在哪个终端(TTY)
以及进程已用的CPU时间。
如果你想查看系统上运行的所有进程,可用-ef
:-e参数指定显示所有运行在系统上的进程;-f参数则扩展了输
出,这些扩展的列包含了有用的信息。
UID:启动这些进程的用户。
PID:进程的进程ID。
PPID:父进程的进程号(如果该进程是由另一个进程启动的)。
C:进程生命周期中的CPU利用率。
STIME:进程启动时的系统时间。
TTY:进程启动时的终端设备。
TIME:运行进程需要的累计CPU时间。
CMD:启动的程序名称
。如果想要获得更多
的信息,可采用-l参数,它会产生一个长格式输出。
$ ps -l
F S UID PID PPID C PRI NI ADDR SZ WCHAN TTY TIME CMD
0 S 500 3081 3080 0 80 0 - 1173 wait pts/0 00:00:00 bash
0 R 500 4463 3081 1 80 0 - 1116 - pts/0 00:00:00 ps
$
注意使用了-l参数之后多出的那些列。
F:内核分配给进程的系统标记。
S:进程的状态(O代表正在运行;S代表在休眠;R代表可运行,正等待运行;Z代表僵
化,进程已结束但父进程已不存在;T代表停止)。
PRI:进程的优先级(越大的数字代表越低的优先级)。
NI:谦让度值用来参与决定优先级。
ADDR:进程的内存地址。
SZ:假如进程被换出,所需交换空间的大致大小。
WCHAN:进程休眠的内核函数的地址。
ps命令虽然在收集运行在系统上的进程信息时非常有用,但也有不足之处:它只能显示
某个特定时间点的信息。如果想观察那些频繁换进换出的内存的进程趋势,用ps命令就不方
便了。
而top命令刚好适用这种情况。top命令跟ps命令相似,能够显示进程信息,但它是实时显
示的。图4-1是top命令运行时输出的截图。
输出的第一部分显示的是系统的概况:第一行显示了当前时间、系统的运行时间、登录的用
户数以及系统的平均负载。
平均负载有3个值:最近1分钟的、最近5分钟的和最近15分钟的平均负载。值越大说明系统
的负载越高。由于进程短期的突发性活动,出现最近1分钟的高负载值也很常见,但如果近15分
钟内的平均负载都很高,就说明系统可能有问题
下一行显示了CPU的概要信息。top根据进程的属主(用户还是系统)和进程的状态(运行、
空闲还是等待)将CPU利用率分成几类输出。
紧跟其后的两行说明了系统内存的状态。第一行说的是系统的物理内存:总共有多少内存,
当前用了多少,还有多少空闲。后一行说的是同样的信息,不过是针对系统交换空间(如果分配
了的话)的状态而言的。
最后一部分显示了当前运行中的进程的详细列表,有些列跟ps命令的输出类似。
PID:进程的ID。
USER:进程属主的名字。
PR:进程的优先级。
NI:进程的谦让度值。
VIRT:进程占用的虚拟内存总量。
RES:进程占用的物理内存总量。
SHR:进程和其他进程共享的内存总量。
S:进程的状态(D代表可中断的休眠状态,R代表在运行状态,S代表休眠状态,T代表
跟踪状态或停止状态,Z代表僵化状态)。
%CPU:进程使用的CPU时间比例。
%MEM:进程使用的内存占可用内存的比例。
TIME+:自进程启动到目前为止的CPU时间总量。
COMMAND:进程所对应的命令行名称,也就是启动的程序名。
默认情况下,top命令在启动时会按照%CPU值对进程排序。可以在top运行时使用多种交互
命令重新排序。每个交互式命令都是单字符,在top命令运行时键入可改变top的行为。键入f允
许你选择对输出进行排序的字段,键入d允许你修改轮询间隔。键入q可以退出top。用户在top
命令的输出上有很大的控制权。用这个工具就能经常找出占用系统大部分资源的罪魁祸首。当然
了,一旦找到,下一步就是结束这些进程。这也正是接下来的话题。
结束进程
作为系统管理员,很重要的一个技能就是知道何时以及如何结束一个进程。有时进程挂起了,
只需要动动手让进程重新运行或结束就行了。但有时,有的进程会耗尽CPU且不释放资源。在这
两种情景下,你就需要能控制进程的命令。Linux沿用了Unix进行进程间通信的方法。
在Linux中,进程之间通过信号来通信。进程的信号就是预定义好的一个消息,进程能识别
它并决定忽略还是作出反应。进程如何处理信号是由开发人员通过编程来决定的。大多数编写完
善的程序都能接收和处理标准Unix进程信号。这些信号都列在了表4-4中。
表4-4 Linux进程信号
信 号 名 称 描 述
1 HUP 挂起
2 INT 中断
3 QUIT 结束运行
9 KILL 无条件终止
11 SEGV 段错误
15 TERM 尽可能终止
17 STOP 无条件停止运行,但不终止
18 TSTP 停止或暂停,但继续在后台运行
19 CONT 在STOP或TSTP之后恢复执行
在Linux上有两个命令可以向运行中的进程发出进程信号。
1. kill命令
kill命令可通过进程ID(PID)给进程发信号。默认情况下,kill命令会向命令行中列出的
全部PID发送一个TERM信号。遗憾的是,你只能用进程的PID而不能用命令名,所以kill命令有
时并不好用。
要发送进程信号,你必须是进程的属主或登录为root用户。
$ kill 3940
-bash: kill: (3940) - Operation not permitted
$
TERM信号告诉进程可能的话就停止运行。不过,如果有不服管教的进程,那它通常会忽略
这个请求。如果要强制终止,-s参数支持指定其他信号(用信号名或信号值)。
你能从下例中看出,kill命令不会有任何输出。
# kill -s HUP 3940
#
要检查kill命令是否有效,可再运行ps或top命令,看看问题进程是否已停止。
2. killall命令
killall命令非常强大,它支持通过进程名而不是PID来结束进程。killall命令也支持通
配符,这在系统因负载过大而变得很慢时很有用。
# killall http*
#
上例中的命令结束了所有以http开头的进程,比如Apache Web服务器的httpd服务。
2. killall命令
killall命令非常强大,它支持通过进程名而不是PID来结束进程。killall命令也支持通
配符,这在系统因负载过大而变得很慢时很有用。
# killall http*
#
上例中的命令结束了所有以http开头的进程,比如Apache Web服务器的httpd服务。
4.2 监测磁盘空间
系统管理员的另一个重要任务就是监测系统磁盘的使用情况。不管运行的是简单的Linux台
式机还是大型的Linux服务器,你都要知道还有多少空间可留给你的应用程序。
在Linux系统上有几个命令行命令可以用来帮助管理存储媒体。本节将介绍在日常系统管理
中经常用到的核心命令。
4.2.1 挂载存储媒体
如第3章中讨论的,Linux文件系统将所有的磁盘都并入一个虚拟目录下。在使用新的存储媒
体之前,需要把它放到虚拟目录下。这项工作称为挂载(mounting)。
在今天的图形化桌面环境里,大多数Linux发行版都能自动挂载特定类型的可移动存储媒体。
可移动存储媒体指的是可从PC上轻易移除的媒体,比如CD-ROM、软盘和U盘。
如果用的发行版不支持自动挂载和卸载可移动存储媒体,就必须手动完成。本节将介绍一些
可以帮你管理可移动存储设备的Linux命令行命令。
1. mount命令
Linux上用来挂载媒体的命令叫作mount。默认情况下,mount命令会输出当前系统上挂载的
设备列表。