Linux系列8-进程管理

  • 对进程及其属性的介绍
  • ps进程监视命令
  • top命令即时跟踪进程
  • lsof命令查看占用文件进程
  • kill命令向进程发送信号
  • /PROC文件系统
    如要下载笔记和代码请到我的github

    上手

  • 下列是一个自动创建进程的badpro程序,会自动打开程序并且创建目录和文件。
    1
    2
    3
    4
    5
    6
    7
    8
    9
    #! /bin/bash
    while echo "I'm making files!!"
    do
    mkdir adir
    cd adir
    touch afile

    sleep 2s
    done
1
2
$ chmod +x badpro
$ ./badpro &
  • ps:查看程序的PID号(PID号用于唯一表示一个进程)。
    • ps aux | grep badpro(是将前一个命令的输出作为后一个命令的输入)。
      1
      $ kill PID

进程

  1. Linux是一种多用户、多进程的操作系统。
  2. 在Linux的内核中维护着一张表,这张表记录了当前系统中运行的所有进程的各种信息。内核会自动完成对进程的控制和调度。
  3. 进程,是正在运行的程序。

    进程的属性

  • PID:进程的ID号;
    • Linux自己使用PID确定进程,也要求用户在管理进程时提供相应的PID号;
    • 几乎所有进程管理工具都使用PID而不是进程名。
  • PPID:父进程的PID;
    • Linux中,所有的进程都必须由另一个进程创建——除了在系统引导时,直接由内核主动创建并安装的几个进程。当一个进程被创建时,创建它的那个进程被称为父进程,而这个进程就叫做子进程。子进程应该是其父进程的克隆体。
  • UID:真实用户ID;
    • 只有进程的创建者和root用户才有权利对该进程进行操作,于是记录一个进程的创建者(也就是属主)就显得非常必要,进程的UID就是其创建者的用户ID号,用于标识进程的属主。
  • EUID:有效的用户ID
    -Linux还为进程保存一个”有效用户ID号”,被称作EUID,用来确定进程对某些资源和文件的访问权限。绝大部分情况下,进程的UID和EUID是一致的——除了著名的SETUID程序。
  • 允许用户修改密码的命令passwd命令就是一个典型的SETUID程序,其UID是当前执行这个命令的用户ID,而EUID是root用户的ID(也就是0)。
  • GID和EGID:真实和有效的组ID;
    • EGID可能在确定访问权限方面还发挥了一定作用
  • 谦让度和优先级;
    • 进程的优先级决定了其受到CPU优待的程度,优先级高的进程可以更早地被处理,并获得更多的处理器时间;
    • 决定进程何时被处理是内核的事情,不用用户插手,但用户可以设置进程的谦让度来影响内核的想法。

      监视进程: ps命令

  • ps是最常用的监视进程的命令。
  • ps aux命令用于现实当前系统上运行的所有进程的信息。其中部分行代表的信息是
字段 含义
USER 进程创建者的用户名
PID 进程的ID号
%CPU 进程占用CPU的百分比
%MEM 进程占用内存的百分比
VSZ 进程占用的虚拟内存大小
RSS 内存中页的数量(页是管理内存的单位,在PC上通常为4K)
TTY 进程所在终端的ID号
STAT 进程状态,常用字母代表含义如下:
R 正在运行/可运行 D 睡眠中(不可被唤醒,通常是在等待I/O设备)
S 睡眠中(可以被唤醒) T 停止(由于受到信号或被跟踪)
Z 僵进程(已经结束而没有释放系统资源的进程)
————
常用的附加标志有:
< 进程拥有比普通优先级高的优先级
N 进程拥有比普通优先级低的优先级
L 有些页面被锁在内存中
s 会话的先导进程
START 进程启动时间
TIME 进程已经占用的CPU时间
COMMAND 命令和参数
  • ps的另一组选项lax可以提供PPID和谦让度(NI)。
    • ps lax不显示进程属主的用户名,因此可以提供更快的运行速度(ps aux需要把UID转化为用户名之后才输出)。

      即时跟踪进程信息:top命令

      ps命令可以一次性给出当前系统中进程信息的快照,但如果管理员需要实时监视进程运行情况,就可以运行top命令即时跟踪当前系统中进程的情况。
      top命令显示的信息会占满一页,且在默认情况下每10s更新一次。使用CPU最多的程序会排在前面,用h查看帮助,q推出。

      查看占用文件的命令:lsof

  • 不带任何参数的lsof命令会列出当前系统中所有打开文件的进程信息。
  • 用文件名作为参数,可以查看占用该文件的进程。

    向进程发送信号:kill

    kill命令用来向进程发送一个信号,这个信号是什么由用户指定。默认发送的是TERM信号,这个信号表示请求终止某项操作。
  • 标准用法是:

    1
    kill [-signal] pid
  • 信号及其编号用kill -l查看(INT为’ctrl+c’)。

信号编号 信号名 描 述 默认情况下执行的操作
0 EXIT 程序退出时收到该信号 终止
1 HUP 挂起 终止
2 INT 中断 终止
3 QUIT 退出 终止
9 KILL 杀死 终止
11 SEGV 段错误 终止
15 TERM 软件终止 终止

hints:信号名前缀SIG是可以省略,即 kill -SIGTERM pidkill -TERM pid都是一样的。

  • 注意kill命令不一定可以终止一个进程,既然kill命令向进程发送一个信号,这个信号就能被程序捕捉,程序可以“封锁”或者“忽略”捕捉到的信号。只有在信号没有被程序捕捉的情况下,系统才会执行默认操作。比如可以加入trap "" TERM来忽略TERM信号。
  • KILL信号永远不能被程序所捕捉KILL信号可以在内核级别杀死进程。kill -SIGTERM pidkill -TERM pidkill -9 pid
    也有KILL信号都不能影响的进程,常常是由一些退化的I/O(输入/输出)虚假锁定造成的。此时,重新启动系统是唯一的解决办法。

    调整进程的谦让度:nice和renice

  • nice命令可以在启动程序时设置其谦让度,调整的是“相对”谦让度值。
    • 用不带参数的nice的命令查看默认谦让度值,一般是0。
  • renice命令在程序运行时调整其谦让度值,调整的是“绝对”谦让度值。
  • 高谦让度表示低优先级,低谦让度(尤其是负数)的程序会占用更多的CPU时间,拥有更高的优先级。
  • 新进程一般将从其父进程那里继承谦让度。为保证低优先级的进程不会派生出高优先级的进程,允许进程的属主提高其谦让度(降低优先级),但不能降低谦让度。但是root用户可以任意设置进程的优先级

    /PROC文件系统

  • /proc目录下存放了内核有关系统状态的各种有意义的信息。
    • 在系统运行时,内核会随时向这个目录写入数据。pstop命令就是从此目录中读取数据的。
    • 实际上,这是操作系统向用户提供的一条通往内核的通道,用户甚至可以通过向/PROC目录下的文件写入数据来修改操作系统参数。
    • 内容说明:
      • 以数字命名的目录存放着对应进程的信息。/proc/1包含进程init的信息,由内核在系统启动时创建,是除了那个时候同时创建的几个内核进程之外所有进程的父进程。

        参考文献

        Linux从入门到精通 刘忆智 著
文章目录
  1. 1. 上手
  2. 2. 进程
  3. 3. 进程的属性
  4. 4. 监视进程: ps命令
  5. 5. 即时跟踪进程信息:top命令
  6. 6. 查看占用文件的命令:lsof
  7. 7. 向进程发送信号:kill
  8. 8. 调整进程的谦让度:nice和renice
  9. 9. /PROC文件系统
  10. 10. 参考文献
|