Linux系统的进程
管理
1 s- s( p! u, N& p9 J
* w' {- x/ k: s作者:TechRepublic.com
9 l, ?9 r: \1 X
Thursday,February1320033:34PM在Linux系统里,当前正在运行的
程序实例称为进程。比如,当你启动Apache的时候,系统会为它分配一个进程ID。然后就可以用这个ID监视和控制这个程序。
+ `& y$ _8 _4 N9 _ K& b% p+ I
4 \) j1 Y m4 W1 T" j+ @
: w3 z3 b" D& J- m- b7 c. y" H+ ^
! W% [2 \% M! d2 V8 ?4 T进程监视和控制是任何Linux系统管理员的核心任务。一个管理员可以终止("kill")、重启一个进程,甚至可以为它指定一个不同的优先级。
标准的Linux命令"ps"和"top"通常用于查看当前的进程列表。下面我来说明如何用这些命令和其它命令来管理Linux系统中的进程。
" \- l' d6 h- ^/ \0 G5 k
. C; k4 r. c$ C& `
用ps监视进程
% k+ X* }/ S7 q/ x
一个监视Linux的标准工具就是"ps",它是进程状态的简称。这个命令返回正在运行的程序的
信息。这些信息可能包括程序是在哪个用户名下运行的,使用了多少
CPU以及运行了多长
时间。如果你要手工终止程序或者确定是哪个程序让系统变慢时,这些信息是很有用的。
& m) g1 J" d& I# d4 I, L* O
! r7 _% F0 y- P; s1 z. h2 u% D( I如果你只是键入了"ps"这个命令,那么只能列出运行在当前终端下的进程。下面的例子是通过远程
shell运行"ps"输出的结果:
" D& U9 a6 e2 K: f9 y0 K0 [
) k" s0 v3 f5 o) z W$ps
; l1 _4 E/ I- O& R* G
PIDTTYTIMECMD
; y! }3 \, o' Y' E" I5 U7 v4684pts/1400:00:00bash
& O5 ~' \) p! X3 ]) N
27107pts/1400:00:00ps
% P; @* h/ s* X, F' o. j% c# J' U! Z: j3 O
从输出可以看出,分配给这个用户/终端的进程只有Bashshell和ps命令本身。你还可以看到为每个进程列出的PID(进程ID)和TTY、TIME和CMD。TTY指明这个进程正在运行在哪个终端上,TIME指明了这个进程已经使用了多少CPU时间,CMD则是启动这个进程的命令名称。
- i1 F0 q1 i+ ^* r' n. U9 k1 V; H, k
用户可以看到,标准的ps命令只能列出基本的信息。要想获得Linux系统上运行的进程的详细信息,你必须加入一些命令行参数。
0 z }0 b+ k3 s0 X+ N1 p
' ]+ m0 I; E( Q5 t: y' d加入ps常用的aux参数后可以显示其他用户启动的进程(a)、查看系统中属于自己的进程(x)以及启动这个进程的用户和它启动的时间(u)。
4 [- T; _) S0 y8 Q- x* X; d6 o
& y9 \- P3 \) [% i5 X( F8 Q表A示例了psaux命令的输出。
* t; C4 n$ J0 B% r, A5 G( D$ a; H) S1 c1 \ J M
现在还有其它更多的信息,增加了USER、%CPU、%MEM、VSZ、
RSS、STAT和START这几个域。现在我们来看一下这些信息是什么含义。
/ L) ^" u. c, J: n0 S- k9 x2 W; r% f2 D5 c2 c: g+ V
首先,用户可以看到所有的进程,而不仅仅是运行在终端上的那些。USER域指明了是哪个用户启动了这个命令。很多进程和系统一起启动,而且会把根或者一些系统帐号列为USER。当然,其它一些进程是单独运行的。这个信息本身就可以帮助你缩小问题范围。假如某个用户启动了脚本,占用了
服务器大量的I/O。如果能马上找到是谁在运行这个程序,那么就可以大大加快解决问题的
速度。
$ f9 f' M5 `* w/ U: {% u, R
: F; {0 Y% j7 L; a" w& G- {%CPU、%MEM、VSZ和RSS这几个域都与系统资源有关。首先,用户可以查看某个进程占用了多少CPU。这个信息是实时显示的,所以很难用ps捕捉峰值。可能用户会发现,为了找到引发问题的那个进程需要不停地运行ps命令。
9 W& I+ k6 r" B" B( _
; v2 }, a* H; J9 Y除了CPU使用情况,还可以看到
内存使用及其VSZ(虚拟
内存大小)和RSS(常驻集大小)。VSZ表示如果一个程序完全驻留在
内存的话需要占用多少
内存空间,而RSS指明了当前实际占用了多少内存。如果能够了解一个进程当前占用了多少内存,那么就可以确定这个进程是在正常运行还是出现了异常。程序通常都会消耗比正常情况更多的内存和CPU。虽然
程序员都在尽力确保代码正确地使用资源,但是有时候还是要由管理员来决定终止还是重启进程。
7 g# u5 ?3 z. ^1 Y
) t( \! b3 E$ L, j n( ~" _用户可能会注意到在psaux命令的输出结果里,大部分TTY域有个"?"。这是因为这些程序或者在系统启动的时候就开始运行了,或者是由初始化脚本(initscript)启动的。这些进程没有控制终端,所以作了标记。另外,linux-sanity-check命令有一个TTY的值为pts/14。这个命令是远程连接运行的,有与其关联的一个终端。当你的
机器开放了多条连接,而你又想确定某个命令运行在哪个窗口的时候,这个信息是很有用的。
/ ^& N3 \+ M8 P) s" Z
) v( ?0 M, `2 y
STAT显示了进程当前的状态。在我们的例子里,很多进程处在
睡眠状态,STAT域里的"S"指明了这一状态。这仅仅表明这些进程在等待某些事件发生--可能是用户输入或者系统资源的可用性。linux-sanity-check命令则有一个R状态,这个状态表明进程当前正在运行。有时候你可以浏览一下这个列表然后找那些R状态的进程。如果大部分进程处在睡眠状态而又有问题发生,那么只关注那些正在运行的进程是最好的方法。那种状态不一定能说明发生了问题,但是有时候如果进程运行的时间过长可能意味着发生了某些深层次的问题。