进程管理 进程的监控与管理 ps/pstree/top/lsof

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>]

选项含义如下:

  1. -a  显示启动每个进程对应的完整指令,包含启动进程的路径、参数等等。
  2. -c  不使用精简法显示进程信息,即显示的进程中包含子进程和父进程。
  3. -n  根据进程PID号来排序输出,默认是以程序名称排序输出的。
  4. -p  显示进程的PID。
  5. -u  显示进程对应的用户名称。
  6. PID:即进程对应的PID号,或者叫进程识别号。
  7. 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的输出还有很多进程信息,这里仅仅拿出前几个进程进行重点讲解,理解其它进程的含义基本与这些相同。

猜你喜欢

转载自blog.csdn.net/qq_34556414/article/details/126019700