本来应该将进程的概念发布的,可惜忘了做数据备份,重做了系统才后知后觉,所以,对于进程的概念还是将起系统管理类写完之后进行其补充,那么在上一章中我们进行简单的梳理一下,进程的运行状态大概分为运行态、就绪态、睡眠态、停止态、僵死态,而睡眠态则可分为可中断睡眠及不可中断睡眠,这是根据其进程在CPU上的运行周期来决定其进程状态,假设正在运行中的进程,而时间周期却已经耗尽,那么不管有多不情愿都得先散场退居二线。

  一般来讲可中断睡眠是等待IO完成而被阻塞的进程,CPU运行速度很快,一旦指令进程用到数据时,如果要从磁盘上加载到内存中的话,CPU只能是白白的空转,并创建子进程来处理,等待加载IO完成,那么这个过程我们就称之为等待IO完成过程,但CPU空转对于系统来说是一种资源浪费,一旦某个进程遭遇阻塞,那么内核让其CPU其运行其它的进程指令,回过头来,当那个子进程完成数据加载时,CPU就会暂时停止处理其它进行,而后则父进程销毁子进程并且继续运行。

  那么线程就是轻量级的进程,是进程的子单位,一个进程流可以生成多个线程,而多个线程可并行运行,从而该进程可运行的速度更快,但是前提是主机上一定要有多个CPU核心,否则会很麻烦,因为需要调度及切换,在切换过程中又浪费了大量的时间周期。

一、Linux进程管理工具

  那么我们在这一章节中开始讲述Linux的管理工具,大约涉及的命令工具有:

pstree, ps, pidof, pgrep, top, htop, glances, pmap, vmstat, dstat, kill, pkill, job, bg, fg, nohup, nice, renice, killall, ...

  在RHEL系列,无论是CentOS 5, 6, 7的启动方式以及管理进程的方式都不一样。进程是运行程序的实体,内核都必须要管理进程,因为任何程序的运行都必须得接受内核管理,内核给进程创建了一个虚拟的空间,给出了除了该进程以及内核存在,任何一个进程,对于内核来说必须要进行追踪,无论是创建及销毁进程,都是由内核管理,不过内核其实并不想管理太多繁杂之事,对于用户空间的请求,统一由一个进程来管理,称之为init,由它代理并向内核发起请求。

CentOS 5:SysV initCentOS 6:upstartCentOS 7:systemd    /sbin/init

  现在就开始介绍一些进程管理命令,第一个命令为pstree,该命令是对进程树进行查看,那么所看到系统的顶级进程对于不同的系统版本来讲有可能是不一样的,那么在CentOS 7中所看到的是systemd进程,而对于CentOS 5,6来说,其顶级进程为init

    pstree命令:        pstree - display a tree process

  那么接下来命令为ps命令,改命令就是将当前系统运行这一刻的状态截取并显示,不过只显示命令这一刻一次所有的进程状态。在用户空间中,通过接口/proc/伪文件系统,内核就将自己内部很多的状态信息是通过/proc输出给用户的。而这些状态信息就是其内核的参数,一类是可设置的参数,用于改变内核运行特征,路径在:/proc/sys,而另外的一种为状态参数,用于输出内核统计的状态信息,仅对用户查看。为了能延续Linux哲学思想一切皆文件,所以将参数模拟成文件系统让在用户空间中供给用户进行查看。而每一个proc下的进程文件,都有一个目录,以数字命名,这个数字就是PID,存放着各种状态信息。

    ps命令:        /proc/:内核中的状态信息;            内核参数:                可设置其值从而调整内核运行特征的参数;/proc/sys/                状态变量:其用于输出内核统计信息或状态信息,仅用于查看;                        参数:模拟成文件系统类型;                    进程:            /proc/#

  那么该命令的用法为:

    ps - report a snapshot of the current processes.        ps [options]

  而对于选项来讲,共有三种风格的选项:

    选项有三种风格:        1   UNIX options, which may be grouped and must be preceded by a dash.        2   BSD options, which may be grouped and must not be used with a dash.        3   GNU long options, which are preceded by two dashes.

  在我们启动进程时,共有两种方式,一种是通过终端启动,另一种是无需通过终端来启动,在系统启动过程中自动启动的程序,我们称之为与终端无关的进程,而用户通过终端启动某一个程序载入内存让其CPU运行为进程时,我们就称之为与终端相关的进程。

    启动进程的方式:        系统启动过程中自动启动:与终端无关的进程;        用户通过终端启动:与终端相关的进程;

  而我们可以使用一些选项用来查看与终端有关及无关的进程。

    选项:        a:所有与终端相关的进程;        x:所有与终端无关的进程;        u:以用户为中心组织进程状态信息显示;

  那么接下来我们开始说一次该命令的常用组合。

    常用组合之一:aux        VZS:虚拟内存集;        RSS:Resident Size,常驻内存集;        STAT:            R:running            S: interrupdate sleeping            D: uninterrupdate sleeping            T: Stopped            Z: zombie                        +:前台进程;            l:多线程进程;            N:低优先级进程;            <:高优先级进程;            s:session leader;(会话引领者)
# ps auxUSER        PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMANDroot          1  0.0  0.6 128164  6824 ?        Ss   14:35   0:06 /usr/lib/systemd/systemd --switched-root --system --deserialize 21root          2  0.0  0.0      0     0 ?        S    14:35   0:00 [kthreadd]root          3  0.0  0.0      0     0 ?        S    14:35   0:00 [ksoftirqd/0]root       1057  0.0  0.0 110044   828 tty1     Ss+  14:36   0:00 /sbin/agetty --noclear tty1 linuxroot       1032  0.0  1.6 614636 16860 ?        Ssl  14:36   0:00 /usr/sbin/libvirtdroot        240  0.0  0.0      0     0 ?        S<   14:35   0:00 [mpt_poll_0]root        601  0.0  0.1  16840  1016 ?        SNs  14:35   0:00 /usr/sbin/alsactl -s -n 19 -c -E ALSA_CONFIG_PATH=/etc/alsa/alsactl.conf --initfilroot       7152  0.0  0.1 151064  1812 pts/0    R+   20:39   0:00 ps aux

  以上就是第一组选项组合方式,共有四种的组合方式,我们现在来说第二种。

    选项:        -e:显示所有进程;        -f:显示完整格式的进程信息;

  那么对于常用组合之二,-ef,为Unix风格。

# ps -efUID         PID   PPID  C STIME TTY          TIME CMDroot          1      0  0 14:35 ?        00:00:06 /usr/lib/systemd/systemd --switched-root --system --deserialize 21root          2      0  0 14:35 ?        00:00:00 [kthreadd]root          3      2  0 14:35 ?        00:00:01 [ksoftirqd/0]root          5      2  0 14:35 ?        00:00:00 [kworker/0:0H]

  而常用组合之三为-efH

    选项:        -F:显示完整格式的进程信息(与-f意义基本相同,不过显示更加详细);            C: cpu utilzation(CPU利用率);            PSR: 运行于那颗CPU之上;        -H:以层级结构显示进程的相关信息;
# ps -efHroot          1      0  0 14:35 ?        00:00:06 /usr/lib/systemd/systemd --switched-root --system --deserialize 21root        354      1  0 14:35 ?        00:00:05   /usr/lib/systemd/systemd-journaldroot        381      1  0 14:35 ?        00:00:00   /usr/sbin/lvmetad -froot        391      1  0 14:35 ?        00:00:02   /usr/lib/systemd/systemd-udevdroot        511      1  0 14:35 ?        00:00:00   /sbin/auditdroot        513    511  0 14:35 ?        00:00:00     /sbin/audispdroot        515    513  0 14:35 ?        00:00:00       /usr/sbin/sedispatch

  而常用组合之四共有两个,第一个-eo,另一个为axo

常用组合之四:-eo    o field1, field2, ...:自定义要显示的字段列表,以逗号分隔;        常用的有:field: pid, ni, pri, psr, pcpu, stat, comm, tty, ppid, rtprio            ni:nice值;            priority:priority, 优先级;            rtprio:real time;            priority,实时优先级;        axo

  接下来介绍的命令为pgreppkill,从pgrep中看的出来,是做一个进程过滤的一个专用命令,而pkill是从过滤出的进程将其杀死关闭,根据其进程名字或其它信息来将其为进程发送信号,所以这两个命令可以组合使用,使用格式都是一样的,而使用格式为:

    pgrep [options] pattern

  该命令的选项为:

    -u, uid:effective user    -U, uid:read user    -t, TERMAINAL:与指定的终端相关的进程;    -l:显示进程名;    -a:显示完整格式的进程名;    -P, pid:显示此进程的子进程;

  下一个介绍的命令为pidof命令,该命令是截取其进程的ID号的,输入进程名,获得其进程号。

    pidof命令:        根据进程名,取其pid;

  接下来所讲的是top命令,它所展示的类似于Windows的任务管理器,它是以动态方式来不断刷新来查看其进程,数值从大到小逆序排序,默认为CPU进行排序。

    top命令:        top - display Linux processes            排序:            P:以占据CPU百分比排序;            M:以占据内存百分比排序;            T:累计占用CPU时间排序;                首部信息:            uptime:l命令;            task及CPU信息:t命令;            内存信息:m命令;                退出命令:q        修改刷新时间间隔:s        终止指定的进程:k

  该命令的选项为:

    选项:        -d #:指定刷新时间间隔,默认为3秒;        -b:以批次方式显示;        -n:显示多少批次;

  uptime命令就是跟top第一列上的信息作用几乎无异,该命令为显示系统时间,运行的时长以及平均负载(load average)。而这个平均负载指的是过去一分钟、五分钟和十五分钟的平均负载,而这个平均负载就是显示等待运行的进程队列的长度。