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


    Linux下,监控和管理进程的命令有很多,下面我们以ps、top、pstree、lsof四个最常用的指令介绍如果有效的监控和管理linux下的各种进程。

    利用ps命令监控系统进程


    ps是linux下最常用的进程监控命令,关于ps命令的语法和使用选项,我们在第四章已经有了详细的讲解,这里重点讲述如何利用ps指令监控和管理系统进程。

    请看下面的示例:

    下面是apache进程的输出信息

    1. [root@localhost ~]#ps -ef | grep httpd
    2. UID PID PPID C STIME TTY TIME CMD
    3. nobody 7272 26037 0 Nov06 ? 00:00:00 /apache2/bin/httpd -k start
    4. nobody 7274 26037 0 Nov06 ? 00:00:00 /apache2/bin/httpd -k start
    5. nobody 7400 26037 0 Nov06 ? 00:00:00 /apache2/bin/httpd -k start
    6. nobody 7508 26037 0 00:09 ? 00:00:00 /apache2/bin/httpd -k start
    7. nobody 7513 26037 0 00:09 ? 00:00:00 /apache2/bin/httpd -k start
    8. nobody 7515 26037 0 00:09 ? 00:00:00 /apache2/bin/httpd -k start
    9. nobody 11998 26037 0 11:14 ? 00:00:00 /apache2/bin/httpd -k start
    10. nobody 12941 26037 0 16:25 ? 00:00:00 /apache2/bin/httpd -k start
    11. nobody 12979 26037 0 16:44 ? 00:00:00 /apache2/bin/httpd -k start
    12. 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进程的子进程。

    其实也可以通过下面的指令方式查看子进程与父进程的对应关系,请看如下操作:

    1. [root@localhost ~]# ps auxf | grep httpd
    2. USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
    3. root 26037 0.0 0.1 6316 2884 ? Ss Oct23 0:00 /apache2/bin/httpd -k start
    4. nobody 7272 0.0 0.1 7016 3740 ? S Nov06 0:00 \_ /apache2/bin/httpd -k start
    5. nobody 7274 0.0 0.1 7016 3704 ? S Nov06 0:00 \_ /apache2/bin/httpd -k start
    6. nobody 7400 0.0 0.1 7012 3676 ? S Nov06 0:00 \_ /apache2/bin/httpd -k start
    7. nobody 7508 0.0 0.1 7012 3732 ? S 00:09 0:00 \_ /apache2/bin/httpd -k start
    8. nobody 7513 0.0 0.1 7012 3700 ? S 00:09 0:00 \_ /apache2/bin/httpd -k start
    9. nobody 12979 0.0 0.1 7016 3684 ? S 16:44 0:00 \_ /apache2/bin/httpd -k start
    10. nobody 12980 0.0 0.1 7012 3652 ? S 16:44 0:00 \_ /apache2/bin/httpd -k start
    11. nobody 12982 0.0 0.1 7016 3664 ? S 16:44 0:00 \_ /apache2/bin/httpd -k start
    12. 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]      [/]

    选项含义如下:

    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用户下对应的进程信息,执行如下命令:

    1. [root@localhost ~]# pstree mysql
    2. mysqld---6*[{mysqld}]

    该输出显示了mysql用户下对应的进程为mysqld,并且mysqld进程拥有5个子进程(5个子进程加一个父进程,共6个进程)。

    为了更详细的了解每个进程的信息,例如每个子进程和父进程对应的PID,执行如下命令:

    1. [root@localhost ~]# pstree -c -p mysql
    2. mysqld(18785)-+-{mysqld}(18787)
    3. |-{mysqld}(18788)
    4. |-{mysqld}(18789)
    5. |-{mysqld}(18790)
    6. |-{mysqld}(18791)
    7. `-{mysqld}(29625)

    通过“-p、-c”参数,清楚的显示了父进程和子进程,以及它们各种的PID。

    如果知道进程对应的PID,想得到进程是由哪个用户启动的,可以执行如下命令:

    1. [root@localhost ~]# pstree -u 26037
    2. httpd---10*[httpd(nobody)]

    从上面可知,httpd进程是由nobody用户启动的。

    如果要查看httpd父进程和每个子进程分别对应的PID,可以执行如下命令组合:

    1. [root@localhost ~]# pstree -u -p 26037
    2. httpd(26037)-+-httpd(24562,nobody)
    3. |-httpd(24563,nobody)
    4. |-httpd(24566,nobody)
    5. |-httpd(24567,nobody)
    6. |-httpd(24631,nobody)
    7. |-httpd(24648,nobody)
    8. |-httpd(24650,nobody)
    9. |-httpd(24654,nobody)
    10. |-httpd(26156,nobody)
    11. `-httpd(29014,nobody)

    如果要得到启动httpd进程的程序路径、参数组合,执行如下命令:

    1. [root@localhost ~]# pstree -a -u -p 26037
    2. httpd,26037 -k start
    3. |-httpd,24563,nobody -k start
    4. |-httpd,24566,nobody -k start
    5. |-httpd,24567,nobody -k start
    6. |-httpd,24631,nobody -k start
    7. |-httpd,24648,nobody -k start
    8. |-httpd,24650,nobody -k start
    9. |-httpd,24654,nobody -k start
    10. |-httpd,26156,nobody -k start
    11. `-httpd,29014,nobody -k start

     

     

     

    利用top监控系统进程


    top命令是监控系统进程必不可少的工具,与ps命令相比,top命令动态、实时的显示进程状态,而ps只能显示进程某一时刻的信息,同时,top命令提供了一个交互界面,用户可以根据需要,人性化的定制自己的输出,更清楚的了解进程的实时状态。

    下面这个例子是某系统在某时刻执行top命令后的输出:

    1. root@webserver ~]# top
    2. Tasks: 126 total, 1 running, 123 sleeping, 1 stopped, 1 zombie
    3. Cpu(s): 0.8% us, 0.1% sy, 0.0% ni, 99.0% id, 0.0% wa, 0.0% hi, 0.0% si
    4. Mem: 8306544k total, 8200452k used, 106092k free, 234340k buffers
    5. Swap: 8385888k total, 160k used, 8385728k free, 7348560k cached
    6. PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
    7. 21115 root 23 0 1236m 360m 2384 S 6 4.4 382:24.14 java
    8. 30295 root 16 0 3552 984 760 R 1 0.0 0:00.09 top
    9. 30118 nobody 15 0 6904 3132 1676 S 0 0.0 0:00.47 httpd
    10. 30250 nobody 15 0 6900 3088 1660 S 0 0.0 0:00.06 httpd
    11. 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的输出还有很多进程信息,这里仅仅拿出前几个进程进行重点讲解,理解其它进程的含义基本与这些相同。

  • 相关阅读:
    贪心算法-
    idea模板设置
    第五十二章 学习常用技能 - Global 映射
    23种设计模式-Java语言实现
    vue实现单页面仿照购物车案例——基于mint-ui和vue2.0
    WFST--学习笔记
    HCM 初学 ( 三 ) - 快速输入PA70、PA71 浏览员工信息PA10
    Python-Flask快速上手
    数据结构:KMP算法的原理图解和代码解析
    hugging face tansformer实战篇-阅读理解任务
  • 原文地址:https://blog.csdn.net/qq_34556414/article/details/126019700