Linux下,监控和管理进程的命令有很多,下面我们以ps、top、pstree、lsof四个最常用的指令介绍如果有效的监控和管理linux下的各种进程。
利用ps命令监控系统进程
ps是linux下最常用的进程监控命令,关于ps命令的语法和使用选项,我们在第四章已经有了详细的讲解,这里重点讲述如何利用ps指令监控和管理系统进程。
请看下面的示例:
下面是apache进程的输出信息
[root@localhost ~]#ps -ef | grep httpd
UID PID PPID C STIME TTY TIME CMD
nobody 7272 26037 0 Nov06 ? 00:00:00 /apache2/bin/httpd -k start
nobody 7274 26037 0 Nov06 ? 00:00:00 /apache2/bin/httpd -k start
nobody 7400 26037 0 Nov06 ? 00:00:00 /apache2/bin/httpd -k start
nobody 7508 26037 0 00:09 ? 00:00:00 /apache2/bin/httpd -k start
nobody 7513 26037 0 00:09 ? 00:00:00 /apache2/bin/httpd -k start
nobody 7515 26037 0 00:09 ? 00:00:00 /apache2/bin/httpd -k start
nobody 11998 26037 0 11:14 ? 00:00:00 /apache2/bin/httpd -k start
nobody 12941 26037 0 16:25 ? 00:00:00 /apache2/bin/httpd -k start
nobody 12979 26037 0 16:44 ? 00:00:00 /apache2/bin/httpd -k start
root 26037 1 0 Oct23 ? 00:00:00 /apache2/bin/httpd -k start
可以看到是一层一层的父进程关系,父进程再派生出子进程。
其中,UID是用户的ID标识号,PID是进程的标识号,PPID表示父进程,STIME表示进程的启动时间,TTY表示进程所属的终端控制台,TIME表示进程启动后累计使用的CPU总时间,CMD表示正在执行的命令。
从中可以清楚的看出,父进程和子进程的对应关系, PPID为26037的所有进程均为子进程,而PID为26037的进程是所有子进程的父进程,子进程由nobody用户启动,而父进程由root用户启动,父进程对应的PPID为1,即父进程同时为init进程的子进程。
其实也可以通过下面的指令方式查看子进程与父进程的对应关系,请看如下操作:
[root@localhost ~]# ps auxf | grep httpd
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
root 26037 0.0 0.1 6316 2884 ? Ss Oct23 0:00 /apache2/bin/httpd -k start
nobody 7272 0.0 0.1 7016 3740 ? S Nov06 0:00 \_ /apache2/bin/httpd -k start
nobody 7274 0.0 0.1 7016 3704 ? S Nov06 0:00 \_ /apache2/bin/httpd -k start
nobody 7400 0.0 0.1 7012 3676 ? S Nov06 0:00 \_ /apache2/bin/httpd -k start
nobody 7508 0.0 0.1 7012 3732 ? S 00:09 0:00 \_ /apache2/bin/httpd -k start
nobody 7513 0.0 0.1 7012 3700 ? S 00:09 0:00 \_ /apache2/bin/httpd -k start
nobody 12979 0.0 0.1 7016 3684 ? S 16:44 0:00 \_ /apache2/bin/httpd -k start
nobody 12980 0.0 0.1 7012 3652 ? S 16:44 0:00 \_ /apache2/bin/httpd -k start
nobody 12982 0.0 0.1 7016 3664 ? S 16:44 0:00 \_ /apache2/bin/httpd -k start
nobody 22664 0.0 0.1 6880 3540 ? S 22:24 0:00 \_ /apache2/bin/httpd -k start
其中,%CPU表示进程占用的CPU百分比,%MEM表示进程占用内存的百分比,VSZ表示进程虚拟大小,RSS表示进程的实际内存(驻留集)大小(单位是页)。STAT表示进程的状态,进程的状态有很多种:用“R”表示正在运行中的进程,用“S”表示处于休眠状态的进程,用“Z”表示僵死进程,用“<”表示优先级高的进程,用“N”表示优先级较低的进程,用“s”表示父进程,用“+”表示位于后台的进程。START表示启动进程的时间。
这个例子将进程之间的关系用树形结构形象的表示出来,可以很清楚的看到,第一个进程为父进程,而其它进程均为子进程。同时从这个输出还可以看到每个进程占用CPU、内存的百分比,还有进程所处的状态等等。
利用pstree监控系统进程
pstree命令以树形结构显示程序和进程之间的关系,使用格式如下:
pstree [-acnpu] [<PID>/<user>]
选项含义如下:
- -a 显示启动每个进程对应的完整指令,包含启动进程的路径、参数等等。
- -c 不使用精简法显示进程信息,即显示的进程中包含子进程和父进程。
- -n 根据进程PID号来排序输出,默认是以程序名称排序输出的。
- -p 显示进程的PID。
- -u 显示进程对应的用户名称。
- PID:即进程对应的PID号,或者叫进程识别号。
- user:系统用户名。
pstree清楚的显示了程序和进程之间的关系,如果不指定进程的PID号,或者不指定用户名称,则将以init进程为根进程,显示系统的所有程序和进程信息,若指定用户或PID,则将以用户或PID为根进程,显示用户或PID对应的所有程序和进程。
举例如下:
如果想知道某个用户下都启动了哪些进程的话,pstree指令可以很容易实现,下面显示mysql用户下对应的进程信息,执行如下命令:
[root@localhost ~]# pstree mysql
mysqld---6*[{mysqld}]
该输出显示了mysql用户下对应的进程为mysqld,并且mysqld进程拥有5个子进程(5个子进程加一个父进程,共6个进程)。
为了更详细的了解每个进程的信息,例如每个子进程和父进程对应的PID,执行如下命令:
[root@localhost ~]# pstree -c -p mysql
mysqld(18785)-+-{mysqld}(18787)
|-{mysqld}(18788)
|-{mysqld}(18789)
|-{mysqld}(18790)
|-{mysqld}(18791)
`-{mysqld}(29625)
通过“-p、-c”参数,清楚的显示了父进程和子进程,以及它们各种的PID。
如果知道进程对应的PID,想得到进程是由哪个用户启动的,可以执行如下命令:
[root@localhost ~]# pstree -u 26037
httpd---10*[httpd(nobody)]
从上面可知,httpd进程是由nobody用户启动的。
如果要查看httpd父进程和每个子进程分别对应的PID,可以执行如下命令组合:
[root@localhost ~]# pstree -u -p 26037
httpd(26037)-+-httpd(24562,nobody)
|-httpd(24563,nobody)
|-httpd(24566,nobody)
|-httpd(24567,nobody)
|-httpd(24631,nobody)
|-httpd(24648,nobody)
|-httpd(24650,nobody)
|-httpd(24654,nobody)
|-httpd(26156,nobody)
`-httpd(29014,nobody)
如果要得到启动httpd进程的程序路径、参数组合,执行如下命令:
[root@localhost ~]# pstree -a -u -p 26037
httpd,26037 -k start
|-httpd,24563,nobody -k start
|-httpd,24566,nobody -k start
|-httpd,24567,nobody -k start
|-httpd,24631,nobody -k start
|-httpd,24648,nobody -k start
|-httpd,24650,nobody -k start
|-httpd,24654,nobody -k start
|-httpd,26156,nobody -k start
`-httpd,29014,nobody -k start
利用top监控系统进程
top命令是监控系统进程必不可少的工具,与ps命令相比,top命令动态、实时的显示进程状态,而ps只能显示进程某一时刻的信息,同时,top命令提供了一个交互界面,用户可以根据需要,人性化的定制自己的输出,更清楚的了解进程的实时状态。
下面这个例子是某系统在某时刻执行top命令后的输出:
root@webserver ~]# top
Tasks: 126 total, 1 running, 123 sleeping, 1 stopped, 1 zombie
Cpu(s): 0.8% us, 0.1% sy, 0.0% ni, 99.0% id, 0.0% wa, 0.0% hi, 0.0% si
Mem: 8306544k total, 8200452k used, 106092k free, 234340k buffers
Swap: 8385888k total, 160k used, 8385728k free, 7348560k cached
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
21115 root 23 0 1236m 360m 2384 S 6 4.4 382:24.14 java
30295 root 16 0 3552 984 760 R 1 0.0 0:00.09 top
30118 nobody 15 0 6904 3132 1676 S 0 0.0 0:00.47 httpd
30250 nobody 15 0 6900 3088 1660 S 0 0.0 0:00.06 httpd
1 root 16 0 1780 552 472 S 0 0.0 0:01.25 init
从top命令的输出可知,此系统有java和httpd两个用户进程在运行。
进程PID为21115的java进程由root用户启动,优先级(PR)为23,占用的虚拟内存总量(VIRT)为1236M,未被换出的物理内存(RES)为360M,共享内存(SHR)为2384 kb。通过这几个选项可以了解java进程对内存的使用量,有助于系统管理员对系统虚拟内存使用状况的掌控。
此刻java进程处于休眠状态(S),从上次更新到现在java占用cpu时间(%CPU)为6%,占用物理内存(%MEM)为4.4%,从进程启动到现在java占用cpu总时间(TIME+)为“382:24.14”,单位是1/100秒。通过了解这些信息,可以使系统管理员掌握java进程对系统CPU、物理内存的使用状况。
两个httpd进程由nobody用户启动,优先级都为15,同时都处于休眠状态。
除去这两个进程,还有top进程,也就是我们执行top命令产生的进程,从进程状态项可知,此进程处于运行状态,另一个是init进程,即所有系统进程的父进程,对应的PID为1。
当然top的输出还有很多进程信息,这里仅仅拿出前几个进程进行重点讲解,理解其它进程的含义基本与这些相同。