第十章: 进程

本章介绍的命令如下:

  • ps: 显示当前所有进程的运行情况
  • top: 实时显示当前所有任务的资源占用情况
  • jobs: 列出所有活动作业的状态信息
  • bg: 设置在后台中运行作业
  • fg: 设置在前台中运行作业
  • kill: 发送信号给某个进程
  • killall: 杀死指定名字的进程
  • shutdown: 关机或者重启系统

10.1 进程如何工作

系统启动时内核会先把它的一些程序初始化为进程, 然后运行一个称为init的程序. init程序会依次运行一系列称为脚本初始化的shell脚本(在/etc目录下), 这些脚本将启动所有的系统服务.

一个程序的运行可以触发其他程序的运行, 在进程系统中这种情况被表述为父进程创建子进程.

内核会保存每个进程的信息以便确保任务有序运行, 每个进程都被分配一个称为进程ID的号码, 进程ID(PID)是按递增顺序来分配的, init进程的PID始终为1.

10.1.1 使用ps命令查看进程信息

用来查看进程信息的命令中ps是使用的最普遍的命令.

ps

ps的输出中含有很多字段, 各个字段的描述如下:

字段名 描述
PID 进程ID
TTY 进程的控制终端, [?]表示没有控制终端
CMD 启动命令行
TIME 进程消耗的CPU时间总和
STAT 进程的当前状态
USER 用户ID, 表示进程所有者
%CPU CPU使用百分比
%MEM 内存使用百分比
VSZ 虚拟耗用内存大小
RSS 实际使用内存大小, 即物理内存(RAM)大小, 以KB为单位
START 进程开启的时间

进程状态的值列表如下:

状态 含义
R 运行状态, 进程正在运行或准备运行
S 睡眠状态, 进程不在运行而是在等待事件发生
D 不可中断的睡眠状态, 进程在等待 I/O操作
T 暂停状态
Z 无效或者僵尸状态, 子进程被终止, 但是父进程没有释放
< 高优先级进程
N 低优先级进程

ps常用的选项有很多, 例如x选项将告知ps命令显示所有的进程, aux选项也比较常用, [-ef] 选项也很常用.

10.1.2 使用top命令动态查看进程信息

top命令将按照进程活动的顺序, 以列表的形式持续更新显示系统进程的当前信息. top命令的显示内容包含两个部分, 顶部显示的是系统总体状态信息, 下面显示的是一张按CPU活动时间排序的进程情况表.

top - 22:02:43 up 51 min,  1 user,  load average: 2.34, 2.20, 2.20
Tasks: 217 total,   1 running, 216 sleeping,   0 stopped,   0 zombie
%Cpu(s): 40.1 us,  6.8 sy,  0.1 ni, 51.9 id,  1.1 wa,  0.0 hi,  0.1 si,  0.0 st
KiB Mem :  8068244 total,  4036644 free,  1755640 used,  2275960 buff/cache
KiB Swap:  3906556 total,  3906556 free,        0 used.  5437536 avail Mem 

  PID USER      PR  NI    VIRT    RES    SHR S  %CPU %MEM     TIME+ COMMAND     
 5216 soren     20   0 2251216 415004  68728 S  68.8  5.1  43:53.73 chromium-b+ 
    3 root      20   0       0      0      0 S   0.0  0.0   0:00.06 ksoftirqd/0 
    5 root       0 -20       0      0      0 S   0.0  0.0   0:00.00 kworker/0:+ 
    7 root      20   0       0      0      0 S   0.0  0.0   0:05.46 rcu_sched   
   10 root      rt   0       0      0      0 S   0.0  0.0   0:00.01 watchdog/0

顶部信息中的字段含义如下表:

字段 含义
1 top 程序名
1 22:02:43 一天中的时间
up 51 min 正常运行时间
1 user 登录用户数
load average 负载均值指等待运行的进程数, 即处于可运行状态的进程数, 三个值分别对应60秒, 5分钟以及15分钟的均值, 该值小于CPU数*1.0 表示负载正常
2 tasks 统计进程数以及各个进程的状态信息
3 40.1 us 用户进程占用CPU时间
6.8 sy 内核占用CPU时间
0.1 ni 友好进程(nice, 低优先级进程)占用CPU时间
51.9 id 空闲CPU时间
1.1 wa I/O操作等待的CPU时间
4 Mem: 物理内存的使用情况
5 Swap: 交换空间(虚拟内存)的使用情况

10.2 控制进程

10.2.1 中断进程

在终端里按下Ctrl-C 键将会中断一个程序, 许多(但不是所有)命令行程序都可以使用这种方法来实现中断.

10.2.2 使进程在后台运行

我们可以通过让程序在后台运行来实现进运行命令行程序, 又让shell提示符返回. 要想在启动程序时让该程序在后台运行, 可以在命令后面加上和号字符(&)来实现.

xlogo &

程序启动后会输出一条信息来显示已经启动的作业编号, 该信息是由shell的一个称为作业控制的特性实现的.

可以通过以下命令查看从该终端启动的所有作业:

jobs

10.2.3 使进程回到前台运行

可以使用以下命令让后台程序返回到前台运行, 以接受用户的输入:

fg %1

参数是百分号加上作业编号, 如果只有一个后台作业则可以不带参数.

10.2.4 停止(暂停)进程

如果想要暂停进程而不是终止进程, 可以将进程移到后台运行. 即在进程在前台运行是按下 Ctrl-Z 来实现, 也可以使用 bg 命令将恢复到前台的进程再次迁移到后台.

bg %1

10.3 信号

kill命令通常用来杀死进程, 参数为进程号或者作业编号.

10.3.1 使用kill命令发送信号到进程

kill命令常用的语法如下:

kill [-signal] PID

如果没有指定信号, 则e默认内发送TERM(进程终止) 信号.

常用的信号如下表:

信号编号 信号名 含义
1 HUP 挂起信号, 运行在终端上的前台程序收到信号将终止, 后台程序缉拿该重启并读取它的配置文件
2 INT 中断信号, 同终端下的Ctrl-C
9 KILL 杀死信号, KILL信号由内核处理, 进程没有机会对自己进行清理或保存当前工作
15 TERM 终止信号, kill命令的默认信号, 如果程序还能够处理信号则将被终止
18 CONT 继续运行信号, 恢复之前接受了STOP信号的进程
19 STOP 暂停信号, 该信号由内核处理, 因此不能被忽略
3 QUIT 退出信号
11 SEGV 段错误信号, 程序使用非法内存空间则内核会发送此信号
20 TSTP 终端暂停信号, 同Ctrl-Z命令, 程序可以选择忽略这个信号
28 WINCH 窗口改变信号, 当窗口改变大小时发送, 可以重新绘制视图来适应新的窗口大小

10.3.2 使用killall命令发送信号到多个进程

使用killall命令可以给指定程序或者指定用户名的多个进程发送信号, 语法格式如下:

killall [-u user] [-signal] name...

10.4 更多与进程相关的命令

其他与进程相关的命令如下:

命令 描述
pstree 以树状模式输出进程列表, 显示了进程的父子关系
vmstat 输出系统资源使用情况的快照, 包括内存, 交换空间和磁盘I/O等
xload 用来绘制显示系统时间负载情况图形的一种图形化界面程序
tload 类似xload, 在终端下绘制

results matching ""

    No results matching ""