鸟哥的linux私房菜学习笔记《三十六》程序与进程管理

程序管理
  1. 简介
    (1)触发任何一个事件时,系统都会将他定义成为一个程序,并且给予这个程序一个 ID ,称为 PID,同时依据启发这个程序的使用者与相关属性关系,给予这个 PID 一组有效的权限设置。
    (2)由这个程序衍生出来的其他程序在一般状态下,也会沿用这个程序的相关权限
    (3)让我们将程序与程序作个总结:
    1 . 程序 (program):通常为 binary program ,放置在储存媒体中(如硬盘、光盘、软盘、磁带等), 为实体文件的型态存在;
    2 . 程序 (process):程序被触发后,执行者的权限与属性、程序的程序码与所需数据等都会被载入内存中, 操作系统并给予这个内存内的单元一个识别码 (PID),可以说,程序就是一个正在运行中的程序。
    (4)因为每个程序都有一个 PID ,那某个程序的父程序该如何判断?就通过 Parent PID (PPID) 来判断即可。此外,子程序可以取得父程序的环境变量。

    
    # 第一行的PPID相同,说明是继承关系:
    
    [root@CentOS ~]# ps -l
    F S   UID   PID  PPID  C PRI  NI ADDR SZ WCHAN  TTY          TIME CMD
    4 S     0  3626  3595  0  80   0 -  2382 -      pts/2    00:00:00 su
    4 S     0  3635  3626  0  80   0 -  1315 -      pts/2    00:00:00 bash
    4 R     0  3715  3635  0  80   0 -  1219 -      pts/2    00:00:00 ps
    [root@CentOS ~]# su kevin
    [kevin@CentOS root]$ ps -l
    F S   UID   PID  PPID  C PRI  NI ADDR SZ WCHAN  TTY          TIME CMD
    0 S   500  3595  3594  0  80   0 -  1282 -      pts/2    00:00:00 bash
    4 S   500  3718  3717  0  80   0 -  1282 -      pts/2    00:00:00 bash
    0 R   500  3736  3718  2  80   0 -  1221 -      pts/2    00:00:00 ps
    
  2. fork and exec:程序调用的流程
    这里写图片描述
    系统先以 fork 的方式复制一个与父程序相同的暂存程序,这个程序与父程序唯一的差别就是 PID 不同! 但是这个暂存程序还会多一个 PPID 的参数,PPID 如前所述,就是父程序的程序识别码啦!然后(2)暂存程序开始以 exec 的方式载入实际要执行的程序,以上述图示来讲,新的程序名称为 qqq ,最终子程序的程序码就会变成 qqq 了
  3. 工作管理简介
    (1)进行工作管理的行为中, 其实每个工作都是目前bash 的子程序,亦即彼此之间是有相关性的。 我们无法以 job control 的方式由 tty1 的环境去管理 tty2 的 bash。
    (2)我们可以在 /etc/security/limits.conf 里面设置使用者同时可以登陆的连线数。
    (3)由于假设我们只有一个终端接口,因此在可以出现提示字符让你操作的环境就称为前景(foreground),至于其他工作就可以让你放入背景 (background) 去暂停或运行。要注意的是,放入背景的工作想要运行时, 他必须不能够与使用者互动。举例来说, vim 绝对不可能在背景里面执行 (running) 的!因为你没有输入数据他就不会跑啊! 而且放入背景的工作是不可以使用 [ctrl]+c 来终止的!
    (4)要进行 bash 的 job control 必须要注意到的限制是:
    这些工作所触发的程序必须来自于你 shell 的子程序(只管理自己的 bash);
    前景:你可以控制与下达指令的这个环境称为前景的工作 (foreground);
    背景:可以自行运行的工作,你无法使用 [ctrl]+c 终止他,可使用 bg/fg 调用该工作;
    背景中“执行”的程序不能等待 terminal/shell 的输入(input)
  4. &:后台执行

    
    # 将整个/etc备份成为/tmp/etc/tar/gz,后台执行
    
    [root@study ~]# tar -zpcf /tmp/etc.tar.gz /etc &
    [1] 14432  #[job number] PID
    [root@study ~]# tar: Removing leading `/' from member names
    
    # 在中括号内的号码为工作号码 (job number),该号码与 bash 的控制有关。
    
    
    # 后续的 14432 则是这个工作在系统中的 PID。至于后续出现的数据是 tar 执行的数据流,
    
    
    # 由于我们没有加上数据流重导向,所以会影响画面。不过不会影响前景的操作。
    
    
    
    # 执行完成显示,1表示完成:
    
    [1]+ Done tar -zpcf /tmp/etc.tar.gz /etc
    
    
    # 重定向将标准输出某个文件
    
    [root@study ~]# tar -zpcvf /tmp/etc.tar.gz /etc > /tmp/log.txt 2>&1 &
    [1] 14547
  5. 将目前的工作丢到后台中暂停:Ctrl+Z
    如果我正在使用 vim ,却发现我有个文件不知道放在哪里,需要到 bash 环境下进行搜寻,此时是否要结束 vim 呢?呵呵!当然不需要啊!只要暂时将 vim 给他丢到背景当中等待即可。

    
    # vim打开文件:
    
    [root@CentOS ~]# vim .bashrc
    
    # 按下Ctrl+Z:
    
    [1]+  Stopped                 vim .bashrc

    屏幕上会出现 [1] ,表示这是第一个工作, 而那个 + 代表最近一个被丢进背景的工作,且目前在背景下默认会被取用的那个工作(与 fg 这个指令有关 )!而那个 Stopped 则代表目前这个工作的状态。在默认的情况下,使用 [ctrl]-z 丢到背景当中的工作都是“暂停”的状态。

  6. jobs:查看目前后天工作状态
    参数:
    -l :除了列出 job number 与指令串之外,同时列出 PID 的号码;
    -r :仅列出正在背景 run 的工作;
    -s :仅列出正在背景当中暂停 (stop) 的工作。

    
    # 查看目前bash当中,所有工作与其对应ID
    
    [root@CentOS ~]# jobs -l
    [1]-  3847 Stopped                 vim .bashrc
    [2]+  3918 Stopped                 find / -print
    

    (1)目前我有两个工作在背景当中,两个工作都是暂停的, 而如果我仅输入 fg 时,那么那个 [2] 会被拿到前景当中来处理”!
    (2)其实 + 代表最近被放到背景的工作号码, - 代表最近最后第二个被放置到背景中的工作号码。 而超过最后第三个以后的工作,就不会有 +/- 符号存在了!

  7. fg:将后台工作拿到前台来处理
    参数:
    %jobnumber :jobnumber 为工作号码(数字)。注意,那个 % 是可有可无的!

    
    # 先以jobs查看工作,再以工作取出:
    
    [root@CentOS ~]# jobs
    [1]+  Stopped                 vim .bashrc
    [2]-  Stopped                 find / -print
    [root@CentOS ~]# fg  #之后按下Ctrl+Z
    [2]+  Stopped                 find / -print
    [root@CentOS ~]# fg %1  #之后按下Ctrl+Z
    [1]+  Stopped                 vim .bashrc
    [root@CentOS ~]# jobs
    [1]+  Stopped                 vim .bashrc
    [2]-  Stopped                 find / -print
    
  8. bg:让工作在后台的状态下变成运行中

    
    # 执行find / -perm +7000 > /tmp/text/txt后,立刻丢掉后台去暂停
    
    [root@CentOS ~]# find / -perm +7000 > /tmp/text.txt  #按下Crel+Z
    [3]+  Stopped                 find / -perm +7000 > /tmp/text.txt
    
    # 让该工作在后台下执行,并且查看它
    
    [root@CentOS ~]# jobs ; bg %3 ; jobs
    [1]   Stopped                 vim .bashrc
    [2]   Stopped                 find / -print
    [3]-  Stopped                 find / -perm +7000 > /tmp/text.txt
    [3]- find / -perm +7000 > /tmp/text.txt &
    [1]   Stopped                 vim .bashrc
    [2]-  Stopped                 find / -print
    [3]   Running                 find / -perm +7000 > /tmp/text.txt &
    
    # 命令行最后方多了一个 & 的符号,代表该工作被启动在背景当中了。
    
  9. kill:管理后台当中的工作
    参数:
    -l :这个是 L 的小写,列出目前 kill 能够使用的信号(signal) 有哪些
    signal :代表给予后面接的那个工作什么样的指示,用 (man 7 signal)可知:
    -1 :重新读取一次参数的配置文件 (类似 reload);
    -2 :代表与由键盘输入 [ctrl]-c 同样的动作;
    -9 :立刻强制删除一个工作;
    -15:(同-SIGTERM )以正常的程序方式终止一项工作。与 -9 是不一样的。

    
    # 找出目前bash环境下的后台工作,并将该工作强制删除
    
    [root@CentOS ~]# jobs
    [1]   Stopped                 vim .bashrc
    [2]-  Stopped                 find / -print
    [root@CentOS ~]# kill -9 %2 ; jobs
    [1]-  Stopped                 vim .bashrc
    [2]+  Stopped                 find / -print
    [root@CentOS ~]# jobs  #等一会再检查
    [1]-  Stopped                 vim .bashrc
    [2]+  Killed                  find / -print
    [root@CentOS ~]# jobs
    [1]+  Stopped                 vim .bashrc
    
    
    # 找出目前bash环境下的后台工作,并将该工作正常终止
    
    [root@CentOS ~]# kill -SIGTERM %1
    
    # 或者
    
    [root@CentOS ~]# kill -15 %1
    
    # -9 这个 signal 通常是用在“强制删除一个不正常的工作”时所使用的, -15 则是以正常步骤结束一项工作(15也是默认值)
    
  10. 脱机管理问题
    (1)后台指的是在终端机模式下可以避免 [crtl]-c 中断的一个情境,所以,工作管理的背景依旧与终端机有关
    (2)at 是将工作放置到系统背景, 而与终端机无关。
    (3)nohup 这个指令来处理喔!这个nohup 可以让你在离线或登出系统后,还能够让工作继续进行。
    nohup用法:

    [root@study ~]# nohup [指令与参数] # 在终端机前景中工作
    [root@study ~]# nohup [指令与参数] # 在终端机背景中工作

nohup 并不支持 bash 内置的指令,因此你的指令必须要是外部指令才行。

# 先编辑一个睡着500秒的程序
[root@CentOS ~]# vim sleep500.sh
[root@CentOS ~]# chmod a+x sleep500.sh 
[root@CentOS ~]# nohup ./sleep500.sh &
[3] 4140
[root@CentOS ~]# nohup: ignoring input and appending output to `nohup.out'
# 或告知这个消息
进程管理
  1. ps:将某个时间点的程序运行情况取下来
    参数:
    -A :所有的 process 均显示出来,与 -e 具有同样的效用;
    -a :不与 terminal 有关的所有 process ;
    -u :有效使用者 (effective user) 相关的 process ;
    x :通常与 a 这个参数一起使用,可列出较完整信息。
    输出格式规划:
    l :较长、较详细的将该 PID 的的信息列出;
    j :工作的格式 (jobs format)
    -f :做一个更为完整的输出。
    一般情况下,直接背两个比较不同的选项即可:
    一个是只能查阅自己 bash 程序的“ps -l ”
    一个则是可以查阅所有系统运行的程序“ ps aux
  2. ps -l 显示出来的数据有哪些:

    [root@CentOS ~]# ps -l
    F S   UID   PID  PPID  C PRI  NI ADDR SZ WCHAN  TTY          TIME CMD
    4 S     0  3626  3595  0  80   0 -  2382 -      pts/2    00:00:00 su
    4 S     0  3635  3626  0  80   0 -  1315 -      pts/2    00:00:00 bash
    4 T     0  3847  3635  0  80   0 -  2748 -      pts/2    00:00:00 vim
    4 T     0  4132  3635  0  80   0 -  1266 -      pts/2    00:00:00 sleep500.sh
    0 T     0  4133  4132  0  80   0 -  1016 -      pts/2    00:00:00 sleep
    0 S     0  4140  3635  0  80   0 -  1266 -      pts/2    00:00:00 sleep500.sh
    0 S     0  4141  4140  0  80   0 -  1016 -      pts/2    00:00:00 sleep
    4 R     0  4199  3635  0  80   0 -  1221 -      pts/2    00:00:00 ps
    

    (1)F:代表这个程序旗标 (process flags),说明这个程序的总结权限,常见号码有:
    若为 4 表示此程序的权限为 root ;
    若为 1 则表示此子程序仅进行复制(fork)而没有实际执行(exec)。
    (2)S:代表这个程序的状态 (STAT),主要的状态有:
    R (Running):该程序正在运行中;
    S (Sleep):该程序目前正在睡眠状态(idle),但可以被唤醒(signal)。
    D :不可被唤醒的睡眠状态,通常这支程序可能在等待 I/O 的情况(ex>打印)
    T :停止状态(stop),可能是在工作控制(背景暂停)或除错 (trac
    (3)UID/PID/PPID:代表“此程序被该 UID 所拥有/程序的 PID 号码/此程序的父程序 PID 号码”
    (4)C:代表 CPU 使用率,单位为百分比;
    (5)PRI/NI:Priority/Nice 的缩写,代表此程序被 CPU 所执行的优先顺序,数值越小代表该程序越快被 CPU 执行
    (6)ADDR/SZ/WCHAN:都与内存有关,ADDR 是 kernel function,指出该程序在内存的哪个部分,如果是个 running 的程序,一般就会显示“ - ” / SZ 代表此程序用掉多少内存 /WCHAN 表示目前程序是否运行中,同样的, 若为 - 表示正在运行中。
    (7)TTY:登陆者的终端机位置,若为远端登陆则使用动态终端接口 (pts/n);
    (8)TIME:使用掉的 CPU 时间,注意,是此程序实际花费 CPU 运行的时间,而不是系统时间
    (9)CMD:就是 command 的缩写,造成此程序的触发程序之指令为何。

  3. ps aux 显示的项目中,各字段的意义为:

    [root@CentOS ~]# ps aux
    USER       PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
    root         1  0.0  0.1   2900  1436 ?        Ss   21:24   0:01 /sbin/init
    root         2  0.0  0.0      0     0 ?        S    21:24   0:00 [kthreadd]
    root         3  0.0  0.0      0     0 ?        S    21:24   0:00 [migration/0]
    root         4  0.0  0.0      0     0 ?        S    21:24   0:00 [ksoftirqd/0]
    root         5  0.0  0.0      0     0 ?        S    21:24   0:00 [migration/0]
    root         6  0.0  0.0      0     0 ?        S    21:24   0:00 [watchdog/0]
    

    USER:该 process 属于那个使用者帐号的?
    PID :该 process 的程序识别码。
    %CPU:该 process 使用掉的 CPU 资源百分比;
    %MEM:该 process 所占用的实体内存百分比;
    VSZ :该 process 使用掉的虚拟内存量 (KBytes)
    RSS :该 process 占用的固定的内存量 (KBytes)
    TTY :该 process 是在那个终端机上面运行,若与终端机无关则显示 ?,另外, tty1-tty6是本机上面的登陆者程序,若为 pts/0 等等的,则表示为由网络连接进主机的程序。
    STAT:该程序目前的状态,状态显示与 ps -l 的 S 旗标相同 (R/S/T/Z)
    START:该 process 被触发启动的时间;
    TIME :该 process 实际使用 CPU 运行的时间。
    COMMAND:该程序的实际指令为何?

    
    # 仅查看自己的bash相关进程,也包括系统所有进程
    
    [root@CentOS ~]# ps -lA
    F S   UID   PID  PPID  C PRI  NI ADDR SZ WCHAN  TTY          TIME CMD
    4 S     0     1     0  0  80   0 -   725 -      ?        00:00:01 init
    1 S     0     2     0  0  80   0 -     0 -      ?        00:00:00 kthreadd
    1 S     0     3     2  0 -40   - -     0 -      ?        00:00:00 migration/0
    1 S     0     4     2  0  80   0 -     0 -      ?        00:00:00 ksoftirqd/0
    1 S     0     5     2  0 -40   - -     0 -      ?        00:00:00 migration/0
    5 S     0     6     2  0 -40   - -     0 -      ?        00:00:00 watchdog/0
    1 S     0     7     2  0  80   0 -     0 -      ?        00:00:00 events/0
    1 S     0     8     2  0  80   0 -     0 -      ?        00:00:00 cgroup
    
    
    # 列出类似进程树的程序显示
    
    [root@CentOS ~]# ps axjf
     PPID   PID  PGID   SID TTY      TPGID STAT   UID   TIME COMMAND
        0     2     0     0 ?           -1 S        0   0:00 [kthreadd]
        2     3     0     0 ?           -1 S        0   0:00  \_ [migration/0]
        2     4     0     0 ?           -1 S        0   0:00  \_ [ksoftirqd/0]
        2     5     0     0 ?           -1 S        0   0:00  \_ [migration/0]
        2     6     0     0 ?           -1 S        0   0:00  \_ [watchdog/0]
        2     7     0     0 ?           -1 S        0   0:00  \_ [events/0]
        2     8     0     0 ?           -1 S        0   0:00  \_ [cgroup]
    
    
    
    # 找出与cron与syslog这两个服务有关的PID号码
    
    [root@CentOS ~]# ps aux | egrep '(cron|syslog)'
    root      1655  0.0  0.1  36164  1544 ?        Sl   21:24   0:00 /sbin/rsyslogd -i /var/run/syslogd.pid -c 5
    root      1752  0.0  0.0   2200   384 ?        Ss   21:24   0:00 /usr/sbin/fcoemon --syslog
    root      2371  0.0  0.1   5996  1276 ?        Ss   21:24   0:01 crond
    kevin     2893  0.0  0.4 104100  4384 ?        S<sl 21:25   0:00 /usr/bin/pulseaudio --start --log-target=syslog
    root      4284  0.0  0.0   4168   764 pts/2    S+   22:33   0:00 egrep (cron|syslog)
    

    在某个程序的 CMD后面还接上 时,就代表该程序是僵尸程序

    apache 8683 0.0 0.9 83384 9992 ? Z 14:33 0:00 /usr/sbin/httpd <defunct>
  4. top:动态查看进程的变化
    参数:
    -d :后面可以接秒数,就是整个程序画面更新的秒数。默认是 5 秒;
    -b :以批次的方式执行 top ,还有更多的参数可以使用喔!
    通常会搭配数据流重导向来将批次的结果输出成为文件。
    -n :与 -b 搭配,意义是,需要进行几次 top 的输出结果。
    -p :指定某些个 PID 来进行观察监测而已。
    在 top 执行过程当中可以使用的按键指令:
    ? :显示在 top 当中可以输入的按键指令;
    P :以 CPU 的使用资源排序显示;
    M :以 Memory 的使用资源排序显示;
    N :以 PID 来排序喔!
    T :由该 Process 使用的 CPU 时间累积 (TIME+) 排序。
    k :给予某个 PID 一个讯号 (signal)
    r :给予某个 PID 重新制订一个 nice 值。
    q :离开 top 软件的按键。

    
    # 每两秒更新一次top,查看整体信息
    
    root@CentOS ~]# top -d 2
    top - 22:36:21 up  1:12,  4 users,  load average: 0.01, 0.04, 0.01
    Tasks: 185 total,   1 running, 181 sleeping,   3 stopped,   0 zombie
    Cpu(s):  0.0%us,  0.5%sy,  0.0%ni, 99.5%id,  0.0%wa,  0.0%hi,  0.0%si,  0.0%st
    Mem:   1030528k total,   927248k used,   103280k free,   180620k buffers
    Swap:  1048568k total,        8k used,  1048560k free,   271428k cached
    
    # 如果有k或r,就会在此显示
    
      PID USER      PR  NI  VIRT  RES  SHR S %CPU %MEM    TIME+  COMMAND                      
     1949 root      20   0  4052 1180 1048 S  0.5  0.1   0:01.30 hald-addon-stor               
     2933 kevin     20   0  115m  59m  28m S  0.5  5.9   0:15.31 vmtoolsd                      
        1 root      20   0  2900 1436 1216 S  0.0  0.1   0:01.50 init                          
        2 root      20   0     0    0    0 S  0.0  0.0   0:00.00 kthreadd                      
        3 root      RT   0     0    0    0 S  0.0  0.0   0:00.00 migration/0                   
        4 root      20   0     0    0    0 S  0.0  0.0   0:00.24 ksoftirqd/0     
    

    top 这个程序可以持续的监测整个系统的程序工作状态。 在默认的情况下,每次更新程序资源的时间为 5 秒,不过,可以使用 -d 来进行修改。 top 主要分为两个画面:
    上面的画面为整个系统的资源使用状态,基本上总共有六行,显示的内容依序是:
    (1)第一行(top…):这一行显示的信息分别为
    目前的时间
    开机到目前为止所经过的时间
    已经登陆系统的使用者人数
    系统在 1, 5, 15 分钟的平均工作负载
    (2)第二行(Tasks…):显示的是目前程序的总量与个别程序在什么状态(running,sleeping, stopped, zombie)
    (3)第三行(%Cpus…):显示的是 CPU 的整体负载,
    (4,5)第四行与第五行:表示目前的实体内存与虚拟内存 (Mem/Swap) 的使用情况
    (6)第六行:这个是当在 top 程序当中输入指令时,显示状态的地方
    至于 top 下半部分的画面,则是每个 process 使用的资源情况:
    (1)PID :每个 process 的 ID 啦!
    (2)USER:该 process 所属的使用者;
    (3)PR :Priority 的简写,程序的优先执行顺序,越小越早被执行;
    (3)NI :Nice 的简写,与 Priority 有关,也是越小越早被执行;
    (4)%CPU:CPU 的使用率;
    (5)%MEM:内存的使用率;
    (6)TIME+:CPU 使用时间的累加;
    top 默认使用 CPU 使用率 (%CPU) 作为排序的重点,如果你想要使用内存使用率排序,则可以按下“M”, 若要回复则按下“P”即可。如果想要离开 top 则按下“ q ”。

    
    # 将top的信息进行2次,然后将结果输出到/tmp/top.txt
    
    [root@CentOS ~]# top -b -n 2 > /tmp/top.txt
    
    
    # 如果你想要观察的程序 CPU 与内存使用率都很低,结果老是无法在第一行显示时,该怎么办?
    
    
    # 我们自己的 bash PID 可由 $$ 变量取得,请使用 top 持续观察该 PID
    	[root@CentOS ~]# echo $$
    
    3635
    [root@CentOS ~]# top -d 2 -p 3635
    top - 22:43:00 up  1:18,  4 users,  load average: 0.00, 0.00, 0.00
    Tasks:   1 total,   0 running,   1 sleeping,   0 stopped,   0 zombie
    Cpu(s):  0.5%us,  1.0%sy,  0.0%ni, 97.5%id,  0.5%wa,  0.5%hi,  0.0%si,  0.0%st
    Mem:   1030528k total,   927296k used,   103232k free,   181288k buffers
    Swap:  1048568k total,        8k used,  1048560k free,   271468k cached
    
      PID USER      PR  NI  VIRT  RES  SHR S %CPU %MEM    TIME+  COMMAND                      
     3635 root      20   0  5260 1748 1416 S  0.0  0.2   0:00.32 bash     
    
    
    # 上面的NI(nice)值是0,修改为10:
    
    [root@CentOS ~]# top -d 2 -p 3635 
    
    # 之后按 r 键,会出现  PID to renice: 
    
    
    # 输入自己的bash PID号码
    
    PID to renice: 3635
    Renice PID 3635 to value: 10
    
    # 发现nice值已更改
    
     PID USER      PR  NI  VIRT  RES  SHR S %CPU %MEM    TIME+  COMMAND                     
     3635 root      30  10  5260 1748 1416 S  0.0  0.2   0:00.32 bash  
    
  5. pstree:树状查看进程相关性
    参数:
    -A :各程序树之间的连接以 ASCII 字符来连接;
    -U :各程序树之间的连接以万国码的字符来连接。在某些终端接口下可能会有错误;
    -p :并同时列出每个 process 的 PID;
    -u :并同时列出每个 process 的所属帐号名称。

    
    # 列出目前系统上面所有的进程树的相关性
    
    [root@CentOS ~]# pstree
    init-+-NetworkManager-+-3*[dhclient]
         |                `-{NetworkManager}
         |-abrtd
         |-acpid
         |-atd
         |-auditd---{auditd}
         |-automount---4*[{automount}]
         |-bonobo-activati---{bonobo-activat}
    
    
    # 列出目前系统上面所有的进程树的相关性,并且显示PID与users
    
    [root@CentOS ~]# pstree -Aup
    init(1)-+-NetworkManager(1801)-+-dhclient(1849)
            |                      |-dhclient(1852)
            |                      |-dhclient(1853)
            |                      `-{NetworkManager}(1851)
            |-abrtd(2363)
            |-acpid(1892)
            |-atd(2387)
            |-auditd(1630)---{auditd}(1631)
            |-automount(2004)-+-{automount}(2005)
            |                 |-{automount}(2006)
    

    所有的程序都是依附在 systemd 这支程序下面的! 仔细看一下,这支程序的 PID 是一号喔!因为他是由 Linux 核心所主动调用的第一支程序!所以 PID 就是一号了。
    如果还想要知道 PID 与所属使用者,加上 -u 及 -p 两个参数即可。

  6. 进程管理简介
    那么程序是如何互相管理的呢?其实是通过给予该程序一个讯号 (signal) 去告知该程你想要让她作什么。
    这里写图片描述
  7. kill -signal PID
    kill 可以帮我们将这个 signal 传送给某个工作 (%jobnumber) 或者是某个 PID (直接输入数字)。 要再次强调的是: kill 后面直接加数字与加上 %number 的况是不同的!

    
    # 以 ps 找出 rsyslogd 这个程序的 PID 后,再使用 kill 传送讯息,使得 rsyslogd 可以重新读取配置文件。答:由于需要重新读取配置文件,因此 signal 是 1 号。至于找出 rsyslogd的 PID 可以是这样做:
    
    ps aux | grep 'rsyslogd' | grep -v 'grep'| awk '{print $2}'
    

    接下来则是实际使用 kill -1 PID,因此,整串指令会是这样:

    kill -SIGHUP $(ps aux | grep 'rsyslogd' | grep -v 'grep'| awk '{print $2}'

    如果要确认有没有重新启动 syslog ,可以参考登录文件的内容,使用如下指令查阅:

    
    tail -5 /var/log/messages
    

    (1)如果你有看到类似“Aug 5 01:25:02 study rsyslogd: [origin software=”rsyslogd”swVersion=”7.4.7” x-pid=”742” x-info=”http://www.rsyslog.com”] rsyslogd was HUPed”之类的字样,就是表示 rsyslogd 在 8/5 有重新启动 (restart) 过了!
    (2)如果未来你想要将某个莫名其妙的登陆者的连线删除的话,就可以通过使用 pstree -p 找到相关程序, 然后再以 kill -9 将该程序删除,该条连线就会被踢掉了.

  8. killall -signal 指令名称
    能直接将 syslogd 这个程序给予一个 SIGHUP 的信号
    参数:
    -e :exact 的意思,表示“后面接的 command name 要一致”,但整个完整的指令不能超过 15 个字符。
    -I :指令名称(可能含参数)忽略大小写。

    
    # 给予syslogd这个命令启动的PID一个SIDHUP的信号
    
    [root@CentOS ~]# killall -l syslogd
    HUP INT QUIT ILL TRAP ABRT IOT BUS FPE KILL USR1 SEGV USR2 PIPE ALRM TERM
    STKFLT CHLD CONT STOP TSTP TTIN TTOU URG XCPU XFSZ VTALRM PROF WINCH IO PWR SYS
    UNUSED
    
    # 如果用 ps aux 仔细看一下,若包含所有参数,则 syslogd -m 0才是最完整的。
    
    
    
    # 强制终止所有以httpd启动的进程
    
    [root@CentOS ~]# killall -9 httpd
    
    
    # 依次询问每个 bash 程序是否需要被终止运行
    
    [root@CentOS ~]# killall -i -9 bash
    Signal bash(3253) ? (y/N) 
    
    # 若没有 -i 的参数,所有的 bash 都会被这个 root 给杀掉!包括 root 自己的 bash 。
    

    总之,要删除某个程序,我们可以使用 PID 或者是启动该程序的指令名称, 而如果要删除某个服务呢?呵呵!最简单的方法就是利用 killall , 因为他可以将系统当中所有以某个指令名称启动的程序全部删除。

  9. 进程的执行顺序
    这里写图片描述
    为了要达到上述的功能,我们 Linux 给予程序一个所谓的“优先执行序 (priority, PRI)”, 这个 PRI 值越低代表越优先的意思。不过这个 PRI 值是由核心动态调整的, 使用者无法直接调整 PRI 值的。

    
    # 查看PRI值
    
    [root@CentOS ~]# ps -l
    F S   UID   PID  PPID  C PRI  NI ADDR SZ WCHAN  TTY          TIME CMD
    4 S     0  3626  3595  0  80   0 -  2382 -      pts/2    00:00:00 su
    4 S     0  3635  3626  0  90  10 -  1315 -      pts/2    00:00:00 bash
    4 T     0  3847  3635  0  80   0 -  2748 -      pts/2    00:00:00 vim
    4 T     0  4132  3635  0  80   0 -  1266 -      pts/2    00:00:00 sleep500.sh
    0 T     0  4133  4132  0  80   0 -  1016 -      pts/2    00:00:00 sleep
    4 T     0  4315  3635  0  80   0 -   676 -      pts/2    00:00:00 top
    0 T     0  4373  3635  0  80   0 -   643 -      pts/2    00:00:00 top
    4 T     0  4385  3635  0  80   0 -   643 -      pts/2    00:00:00 top
    4 T     0  4560  3635  0  90  10 -  1052 -      pts/2    00:00:00 killall
    4 R     0  4667  3635  4  90  10 -  1219 -      pts/2    00:00:00 ps
    

    想要调整程序的优先执行序时,就得要通过 Nice 值了!Nice 值就是上表的 NI 啦!一般来说, PRI 与 NI 的相关性如下:

    PRI(new) = PRI(old) + nice

    虽然 nice 值是可以影响 PRI ,不过, 最终的 PRI 仍是要经过系统分析后才会决定的.
    当 nice 值为负值时,那么该程序就会降低 PRI 值,亦即会变的较优先被处理。
    一些注意事项:
    (1)nice 值可调整的范围为 -20 ~ 19 ;
    (2)root 可随意调整自己或他人程序的 Nice 值,且范围为 -20 ~ 19 ;
    (3)一般使用者仅可调整自己程序的 Nice 值,且范围仅为 0 ~ 19 (避免一般用户抢占系统资源);
    (4)一般使用者仅可将 nice 值越调越高,例如本来 nice 为 5 ,则未来仅能调整到大于 5;
    这也就是说,要调整某个程序的优先执行序,就是“调整该程序的 nice 值”啦!那么如何给予某个程序 nice 值呢?有两种方式,分别是:
    1 . 一开始执行程序就立即给予一个特定的 nice 值:用 nice 指令;
    2 . 调整某个已经存在的 PID 的 nice 值:用 renice 指令。

  10. nice:新执行的指令即给予新的 nice 值
    参数:
    -n :后面接一个数值,数值的范围 -20 ~ 19。

    
    # 用 root 给一个 nice 值为 -5 ,用于执行 vim ,并观察该程序
    
    [root@CentOS ~]# nice -n -5 vim &
    [7] 4713
    [root@CentOS ~]# ps -l
    F S   UID   PID  PPID  C PRI  NI ADDR SZ WCHAN  TTY          TIME CMD
    4 S     0  3626  3595  0  80   0 -  2382 -      pts/2    00:00:00 su
    4 S     0  3635  3626  0  90  10 -  1315 -      pts/2    00:00:00 bash
    4 T     0  3847  3635  0  80   0 -  2748 -      pts/2    00:00:00 vim
    
    # 原本的bsh为90,所以vim默认应为90,因为有指定-5,所以PRI降低了,但不是降到85,而是内核动态调整
    
  11. renice:已存在程序的 nice 重新调整
    参数:
    PID :某个程序的 ID

    
    # 找出自己的 bash PID ,并将该 PID 的 nice 调整到 -5
    
    [root@CentOS ~]# ps -l
    F S   UID   PID  PPID  C PRI  NI ADDR SZ WCHAN  TTY          TIME CMD
    4 S     0  3626  3595  0  80   0 -  2382 -      pts/2    00:00:00 su
    4 S     0  3635  3626  0  90  10 -  1315 -      pts/2    00:00:00 bash
    
    [root@CentOS ~]# renice 10 3635
    3635: old priority 10, new priority 10
    [root@CentOS ~]# ps -l
    F S   UID   PID  PPID  C PRI  NI ADDR SZ WCHAN  TTY          TIME CMD
    4 S     0  3626  3595  0  80   0 -  2382 -      pts/2    00:00:00 su
    4 S     0  3635  3626  0  90  10 -  1315 -      pts/2    00:00:00 bash
    
  12. free:查看内存使用情况
    参数:
    -b :直接输入 free 时,显示的单位是 KBytes,我们可以使用 b(Bytes), m(MBytes)
    k(KBytes), 及 g(GBytes) 来显示单位喔!也可以直接让系统自己指定单位 (-h)
    -t :在输出的最终结果,显示实体内存与 swap 的总量。
    -s :可以让系统每几秒钟输出一次,不间断的一直输出的意思!对于系统观察挺有效!
    -c :与 -s 同时处理~让 free 列出几次的意思

    
    # 显示目前系统的内存容量:
    
    [root@CentOS ~]# free -m
                 total       used       free     shared    buffers     cached
    Mem:          1006        910         96          0        181        265
    -/+ buffers/cache:        463        542
    Swap:         1023          0       1023
    
    # 系统是“很有效率的将所有的内存用光光”,目的是为了让系统的存取性能加速
    
  13. uname:查阅系统与核心相关信息
    参数:
    -a :所有系统相关的信息,包括下面的数据都会被列出来;
    -s :系统核心名称
    -r :核心的版本
    -m :本系统的硬件名称,例如 i686 或 x86_64 等;
    -p :CPU 的类型,与 -m 类似,只是显示的是 CPU 的类型!
    -i :硬件的平台 (ix86)

    
    # 输出系统的基本信息
    
    [root@CentOS ~]# uname -a
    Linux CentOS 2.6.32-431.el6.i686 #1 SMP Fri Nov 22 00:26:36 UTC 2013 i686 i686 i386 GNU/Linux
    
  14. uptime:观察系统启动时间与工作负载

    [root@CentOS ~]# uptime
     23:30:31 up  2:06,  3 users,  load average: 0.00, 0.00, 0.00
    
  15. netstat:追踪网络
    参数:
    -t :列出 tcp 网络封包的数据
    -u :列出 udp 网络封包的数据
    -n :不以程序的服务名称,以埠号 (port number) 来显示;
    -l :列出目前正在网络监听 (listen) 的服务;
    -p :列出该网络服务的程序 PID

    
    # 列出目前系统已经创建的网络连线与 unix socket 状态
    
    [root@CentOS ~]# netstat 
    Active Internet connections (w/o servers)
    Proto Recv-Q Send-Q Local Address               Foreign Address             State      
    tcp        0     52 192.168.0.212:ssh           192.168.0.203:49714         ESTABLISHED 
    tcp        0      0 192.168.0.212:52699         a23-61-250-35.deploy.s:http ESTABLISHED 
    Active UNIX domain sockets (w/o servers)
    Proto RefCnt Flags       Type       State         I-Node Path
    unix  2      [ ]         DGRAM                    12653  @fcm_clif
    unix  31     [ ]         DGRAM                    12305  /dev/log
    unix  2      [ ]         DGRAM                    12266  /var/run/portreserve/socket
    unix  2      [ ]         DGRAM                    8901   @/org/kernel/udev/udevd
    unix  2      [ ]         DGRAM                    13512  @/org/freedesktop/hal/udev_event
    unix  2      [ ]         DGRAM                    12651  @0001e
    unix  3      [ ]         DGRAM                    12578  @/com/intel/lldpad
    

    在上面的结果当中,显示了两个部分,分别是网络的连线以及 linux 上面的 socket 程序相关性部分。
    (1)网际网络连线情况的部分:
    Proto :网络的封包协定,主要分为 TCP 与 UDP 封包,相关数据请参考服务器篇;
    Recv-Q:非由使用者程序链接到此 socket 的复制的总 Bytes 数;
    Send-Q:非由远端主机传送过来的 acknowledged 总 Bytes 数;
    Local Address :本地端的 IP:port 情况
    Foreign Address:远端主机的 IP:port 情况
    State :连线状态,主要有创建(ESTABLISED)及监听(LISTEN);
    (2)上表中 socket file 的输出字段有
    Proto :一般就是 unix 啦;
    RefCnt:连接到此 socket 的程序数量;
    Flags :连线的旗标;
    Type :socket 存取的类型。主要有确认连线的 STREAM 与不需确认的 DGRAM 两种;
    State :若为 CONNECTED 表示多个程序之间已经连线创建。
    Path :连接到此 socket 的相关程序的路径!或者是相关数据输出的路径。

    
    # 找出目前系统上已在监听的网络连接
    
    [root@CentOS ~]# netstat -tlnp
    Active Internet connections (only servers)
    Proto Recv-Q Send-Q Local Address               Foreign Address             State       PID/Program name   
    tcp        0      0 0.0.0.0:111                 0.0.0.0:*                   LISTEN      1702/rpcbind        
    tcp        0      0 0.0.0.0:46546               0.0.0.0:*                   LISTEN      1820/rpc.statd      
    tcp        0      0 192.168.122.1:53            0.0.0.0:*                   LISTEN      2526/dnsmasq        
    tcp        0      0 0.0.0.0:22                  0.0.0.0:*                   LISTEN      2095/sshd           
    tcp        0      0 127.0.0.1:631               0.0.0.0:*                   LISTEN      1850/cupsd          
    tcp        0      0 127.0.0.1:25                0.0.0.0:*                   LISTEN      2339/master         
    tcp        0      0 127.0.0.1:6011              0.0.0.0:*                   LISTEN      3594/sshd           
    tcp        0      0 :::111                      :::*                        LISTEN      1702/rpcbind        
    tcp        0      0 :::44084                    :::*                        LISTEN      1820/rpc.statd      
    tcp        0      0 :::22                       :::*                        LISTEN      2095/sshd           
    tcp        0      0 ::1:631                     :::*                        LISTEN      1850/cupsd          
    tcp        0      0 ::1:25                      :::*                        LISTEN      2339/master         
    tcp        0      0 ::1:6011                    :::*                        LISTEN      35
    
  16. dmesg :分析核心产生的信息

    
    # 输出所有者的内核开机时的信息
    
    [root@CentOS ~]# dmesg | more
    Initializing cgroup subsys cpuset
    Initializing cgroup subsys cpu
    Linux version 2.6.32-431.el6.i686 (mockbuild@c6b8.bsys.dev.centos.org) (gcc version 4.4.7 20120313 (Red Hat 4.4.7-4) (GCC) ) #1 SMP Fri Nov 22 00:2
    6:36 UTC 2013
    KERNEL supported cpus:
      Intel GenuineIntel
      AMD AuthenticAMD
      NSC Geode by NSC
      Cyrix CyrixInstead
      Centaur CentaurHauls
      Transmeta GenuineTMx86
    
    
    # 查找开机的时候硬盘的相关信息
    
    [root@CentOS ~]# dmesg | grep -i sd
    ACPI: RSDP 000f6b80 00024 (v02 PTLTD )
    ACPI: XSDT 3fef1208 0005C (v01 INTEL  440BX    06040000 VMW  01324272)
    ACPI: DSDT 3fef1470 0DA03 (v01 PTLTD  Custom   06040000 MSFT 03000001)
    ACPI: EC: Look up EC in DSDT
    sd 2:0:0:0: [sda] 167772160 512-byte logical blocks: (85.8 GB/80.0 GiB)
    sd 2:0:0:0: [sda] Write Protect is off
    sd 2:0:0:0: [sda] Mode Sense: 61 00 00 00
    sd 2:0:0:0: [sda] Cache data unavailable
    sd 2:0:0:0: [sda] Assuming drive cache: write through
    sd 2:0:0:0: [sda] Cache data unavailable
    
    
    # 查找开机的时候网络的相关信息
    
    [root@CentOS ~]# dmesg | grep -i eth
    udev: renamed network interface eth0 to rename2
    udev: renamed network interface eth1 to eth3
    udev: renamed network interface eth2 to eth4
    udev: renamed network interface rename2 to eth2
    eth3: no IPv6 routers present
    eth2: no IPv6 routers present
    eth4: no IPv6 routers present
    
  17. vmstat :侦测系统资源变化
    参数:
    -a :使用 inactive/active(活跃与否) 取代 buffer/cache 的内存输出信息;
    -f :开机到目前为止,系统复制 (fork) 的程序数;
    -s :将一些事件 (开机至目前为止) 导致的内存变化情况列表说明;
    -S :后面可以接单位,让显示的数据有单位。例如 K/M 取代 Bytes 的容量;
    -d :列出磁盘的读写总量统计表
    -p :后面列出分区,可显示该分区的读写总量统计表
    [root@study ~]# vmstat [-a] [延迟 [总计侦测次数]] <==CPU/内存等信息

    [root@study ~]# vmstat [-fs] #内存相关
    [root@study ~]# vmstat [-S 单位] #设置显示数据的单位
    [root@study ~]# vmstat [-d] #与磁盘有关
    [root@study ~]# vmstat [-p 分区] #与磁盘有关

    利用 vmstat 甚至可以进行追踪。可以使用类似“ vmstat 5 ”代表每五秒钟更新一次,且无穷的更新。
    上面的表格各项字段的意义:
    (1)程序字段 (procs) 的项目分别为: r :等待运行中的程序数量;b:不可被唤醒的程序数量。
    (2)内存字段 (memory) 项目分别为: swpd:虚拟内存被使用的容量; free:未被使用的内存容量; buff:用于缓冲内存; cache:用于高速缓存内存。
    (3)内存交换空间 (swap) 的项目分别为: si:由磁盘中将程序取出的量; so:由于内存不足而将没用到的程序写入到磁盘的 swap 的容量。 如果 si/so 的数值太大,表示内存内的数据常常得在磁盘与内存之间传来传去,系统性能会很差
    (4)磁盘读写 (io) 的项目分别为: bi:由磁盘读入的区块数量; bo:写入到磁盘去的区块数量。如果这部份的值越高,代表系统的 I/O 非常忙碌!
    (5)系统 (system) 的项目分别为: in:每秒被中断的程序次数; cs:每秒钟进行的事件切换次数;这两个数值越大,代表系统与周边设备的沟通非常频繁! 这些周边设备当然包括磁盘、网卡、时间钟等。
    (6)CPU 的项目分别为: us:非核心层的 CPU 使用状态; sy:核心层所使用的 CPU 状态; id:闲置的状态; wa:等待 I/O 所耗费的 CPU 状态; st:被虚拟机 (virtualmachine) 所盗用的 CPU 使用状态 (2.6.11 内核以后才支持)

    
    # 系统上面所有的磁盘的读写状态
    
    [root@CentOS ~]# vmstat -d
    disk- ------------reads------------ ------------writes----------- -----IO------
           total merged sectors      ms  total merged sectors      ms    cur    sec
    ram0       0      0       0       0      0      0       0       0      0      0
    ram1       0      0       0       0      0      0       0       0      0      0
    ram2       0      0       0       0      0      0       0       0      0      0
    ram3       0      0       0       0      0      0       0       0      0      0
    ram4       0      0       0       0      0      0       0       0      0      0
    ram5       0      0       0       0      0      0       0       0      0      0
    ram6       0      0       0       0      0      0       0       0      0      0
    ram7       0      0       0       0      0      0       0       0      0      0
    ram8       0      0       0       0      0      0       0       0      0      0
    ram9       0      0       0       0      0      0       0       0      0      0
    ram10      0      0       0       0      0      0       0       0      0      0
    ram11      0      0       0       0      0      0       0       0      0      0
    ram12      0      0       0       0      0      0       0       0      0      0
    ram13      0      0       0       0      0      0       0       0      0      0
    ram14      0      0       0       0      0      0       0       0      0      0
    ram15      0      0       0       0      0      0       0       0      0      0
    loop0      0      0       0       0      0      0       0       0      0      0
    loop1      0      0       0       0      0      0       0       0      0      0
    loop2      0      0       0       0      0      0       0       0      0      0
    loop3      0      0       0       0      0      0       0       0      0      0
    loop4      0      0       0       0      0      0       0       0      0      0
    loop5      0      0       0       0      0      0       0       0      0      0
    loop6      0      0       0       0      0      0       0       0      0      0
    loop7      0      0       0       0      0      0       0       0      0      0
    sr0        0      0       0       0      0      0       0       0      0      0
    sda    46760  21905 2276228  278798  10161 169569 1437792 2757651      0    213
    sdb      288      1    2312      14      0      0       0       0      0      0
    
特殊文件程序
  1. 具有 SUID/SGID 权限的指令执行状态
    SUID 的程序是如何被一般使用者执行,且具有什么特色呢?
    (1)SUID 权限仅对二进制程序(binary program)有效;
    (2)执行者对于该程序需要具有 x 的可执行权限;
    (3)本权限仅在执行该程序的过程中有效 (run-time);
    (4)执行者将具有该程序拥有者 (owner) 的权限。
    所以说,整个 SUID 的权限会生效是由于“具有该权限的程序被触发”,而我们知道一个程序被触发会变成程序, 所以啰,执行者可以具有程序拥有者的权限就是在该程序变成程序的那个时候啦!第六章我们还没谈到程序的概念, 所以你或许那时候会觉得很奇怪,为啥执行了passwd 后你就具有 root 的权限呢?不都是一般使用者执行的吗? 这是因为你在触发 passwd后,会取得一个新的程序与 PID,该 PID 产生时通过 SUID 来给予该 PID 特殊的权限设置啦! 我们使用 dmtsai 登陆系统且执行 passwd 后,通过工作控制来理解一下!

    [kevin@CentOS ~]$ passwd
    Changing password for user kevin.
    Changing password for kevin.
    (current) UNIX password: 
    
    
    # 查看passwd的身份
    
    [kevin@CentOS ~]$ pstree -u    ├─sshd───sshd───sshd(kevin)───bash───su(root)───bash─┬─killall
         │                                                    ├─sleep500.sh───sleep
         │                                                    ├─su───bash(kevin)─┬─passwd(root)
         │                                                    │                  └─pstree
         │                                                    ├─3*[top]
         │                                                    └─2*[vim]
    
    
    # 那么既然 SUID/SGID 的权限是比较可怕的,您该如何查询整个系统的 SUID/SGID 的文件
    
    呢?使用 find 即可:
    [root@CentOS ~]# find / -perm +6000
    
  2. /proc/* 代表的意义
    所谓的程序都是在内存当中嘛!而内存当中的数据又都是写入到/proc/* 这个目录下的,所以啰,我们当然可以直接观察 /proc 这个目录当中的文件。

    [root@CentOS ~]# ll /proc/
    total 0
    dr-xr-xr-x.  8 root      root         0 Mar 19 22:26 1
    dr-xr-xr-x.  8 root      root         0 Mar 19 22:26 10
    dr-xr-xr-x.  8 root      root         0 Mar 19 22:26 1032
    dr-xr-xr-x.  8 root      root         0 Mar 19 22:26 11
    dr-xr-xr-x.  8 root      root         0 Mar 19 22:26 12
    lrwxrwxrwx.  1 root      root         8 Mar 19 23:52 net -> self/net
    -r--r--r--.  1 root      root         0 Mar 19 23:52 pagetypeinfo
    -r--r--r--.  1 root      root         0 Mar 19 23:52 partitions
    -r--r--r--.  1 root      root         0 Mar 19 23:52 sched_debug
    -r--r--r--.  1 root      root         0 Mar 19 23:52 schedstat
    dr-xr-xr-x.  4 root      root         0 Mar 19 23:52 scsi
    lrwxrwxrwx.  1 root      root        64 Mar 19 23:50 self -> 5041
    -rw-r--r--.  1 root      root         0 Mar 19 23:52 slabinfo
    

    基本上,目前主机上面的各个程序的 PID 都是以目录的型态存在于 /proc 当中。 举例来说,我们开机所执行的第一支程序 init他的 PID 是 1 , 这个 PID 的所有相关信息都写入在/proc/1/* 当中!

    [root@CentOS ~]# ll /proc/1
    total 0
    dr-xr-xr-x. 2 root root 0 Mar 19 22:49 attr
    -rw-r--r--. 1 root root 0 Mar 19 23:53 autogroup
    -r--------. 1 root root 0 Mar 19 23:53 auxv
    -r--r--r--. 1 root root 0 Mar 19 23:53 cgroup
    --w-------. 1 root root 0 Mar 19 23:53 clear_refs
    -r--r--r--. 1 root root 0 Mar 19 23:49 cmdline
    

    里面的数据还挺多的,不过,比较有趣的其实是两个文件,分别是:
    (1) cmdline:这个程序被启动的指令串;
    (2) environ:这个程序的环境变量内容。

    
    # 查阅cmdline内容
    
    [root@CentOS ~]# cat /proc/1/cmdline 
    /sbin/init

    如果是针对整个 Linux 系统相关的参数呢?那就是在 /proc 目录下面的文件:
    这里写图片描述

  3. fuser:借由文件(或文件系统)找出正在使用该文件的程序
    参数:
    -u :除了程序的 PID 之外,同时列出该程序的拥有者;
    -m :后面接的那个文件名会主动的上提到该文件系统的最顶层,对 umount 不成功很有效!
    -v :可以列出每个文件与程序还有指令的完整相关性!
    -k :找出使用该文件/目录的 PID ,并试图以 SIGKILL 这个讯号给予该 PID;
    -i :必须与 -k 配合,在删除 PID 之前会先询问使用者意愿!
    -signal:例如 -1 -15 等等,若不加的话,默认是 SIGKILL (-9)

    
    # 找出目前所在目录的使用 PID/所属帐号/权限
    
    [root@CentOS ~]# fuser -uv .
                         USER        PID ACCESS COMMAND
    .:                   root       3282 ..c.. (root)bash
    

    他说“.”下面有两个 PID 为3282的程序,该程序属于 root且指令为 bash 。 比较有趣的是那个 ACCESS 的项目,那个项目代表的意义为:
    c :此程序在当前的目录下(非次目录);
    e :可被触发为执行状态;
    f :是一个被打开的文件;
    r :代表顶层目录 (root directory);
    F :该文件被打开了,不过在等待回应中;
    m :可能为分享的动态函数库;

    
    # 找到所有使用到 /proc 这个文件系统的程序
    
    [root@CentOS ~]# fuser -uv /proc
                         USER        PID ACCESS COMMAND
    /proc:               rtkit      2760 .rc.. (rtkit)rtkit-daemon
    
    
    # 找到所有使用到 /home 这个文件系统的程序
    
    [kevin@CentOS ~]$ echo $$
    5169
    [kevin@CentOS ~]$ cd /home/
    [kevin@CentOS home]$ fuser -mvu .
                         USER        PID ACCESS COMMAND
    .:                   kevin      2787 F.c.. (kevin)gnome-session
                         kevin      2876 F.... (kevin)gnome-settings-
                         kevin      2885 ....m (kevin)seahorse-daemon
                         kevin      2889 F.c.. (kevin)metacity
    
    [kevin@CentOS home]$ cd ~
    [kevin@CentOS ~]$ umount /home/
    umount: only root can unmount UUID=ea0e1001-64b8-4911-b3bf-59b63c0a5213 from /home  #显示正在忙
    
    # 想要卸载删除即可
    
    [kevin@CentOS ~]$ fuser -mki /home/
    

    既然可以针对整个文件系统,那么能不能仅针对单一文件

    
    # 找到 /var 下面属于 FIFO 类型的文件,并且找出存取该文件的程序
    
    [root@CentOS ~]# find /var -type p
    /var/spool/postfix/public/pickup
    /var/spool/postfix/public/qmgr
    /var/run/autofs.fifo-misc
    /var/run/autofs.fifo-net
    /var/run/pcscd.events/event.3055.17021104
    
    [root@CentOS ~]# fuser -uv /var/spool/postfix/public/pickup 
                         USER        PID ACCESS COMMAND
    /var/spool/postfix/public/pickup:
                         root       2339 F.... (root)master
                         postfix    4595 F.... (postfix)pickup
    
    
    # 尝试删除该PID,但不要删除
    
    [root@CentOS ~]# fuser -ki /var/spool/postfix/public/pickup 
    /var/spool/postfix/public/pickup:  2339  4595
    Kill process 2339 ? (y/N)  
    

    fuser 可以让我们了解到某个文件 (或文件系统) 目前正在被哪些程序所利用

  4. lsof:列出被程序所打开的文件文件名
    参数:
    -a :多项数据需要“同时成立”才显示出结果时!
    -U :仅列出 Unix like 系统的 socket 文件类型;
    -u :后面接 username,列出该使用者相关程序所打开的文件;
    +d :后面接目录,亦即找出某个目录下面已经被打开的文件!

    
    # 列出目前系统上面所有已经被打开的文件与设备
    
    [root@CentOS ~]# lsof
    
    # 注意到了吗?是的,在默认的情况下, lsof 会将目前系统上面已经打开的
    
    
    # 文件全部列出来~所以,画面多的吓人啊!您可以注意到,第一个文件 systemd 执行的
    
    
    # 地方就在根目录,而根目录,嘿嘿!所在的 inode 也有显示出来喔!
    
    
    
    # 仅列出关于 root 的所有程序打开的 socket 文件
    
    [root@CentOS ~]# lsof -u root -a -U
    
    # 注意到那个 -a 吧!如果你分别输入 lsof -u root 及 lsof -U ,会有啥信息?
    
    
    # 使用 lsof -u root -U 及 lsof -u root -a -U ,呵呵!都不同啦!
    
    
    # -a 的用途就是在解决同时需要两个项目都成立时啊!
    
    
    
    # 请列出目前系统上面所有的被启动的周边设备
    
    [root@CentOS ~]# lsof +d /dev
    
    # 因为设备都在 /dev 里面嘛!所以啰,使用搜寻目录即可啊
    
    
    
    # 显示出属于 root 的 bash 这支程序所打开的文件
    
    [root@CentOS ~]# lsof -u root | grep bash
    
  5. pidof :找出某支正在执行的程序的 PID
    参数:
    -s :仅列出一个 PID 而不列出所有的 PID
    -x :同时列出该 program name 可能的 PPID 那个程序的 PID

    
    # 列出目前系统上面 systemd 以及 rsyslogd 这两个程序的 PID
    
    [root@CentOS ~]# pidof systemd rsyslogd
    1655
    
    # 理论上,应该会有两个 PID 才对。上面的显示也是出现了两个 PID 喔。
    
    
    # 分别是 systemd 及 rsyslogd 这两支程序的 PID 啦。
    
    
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值