第十章: 进程
本章介绍的命令如下:
- 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, 在终端下绘制 |