#《快乐的 Linux 命令行》

当系统启动的时候,内核先把一些它自己的活动初始化为进程,然后运行一个叫做 init 的程 序。init,依次地,再运行一系列的称为 init 脚本的 shell 脚本(位于/etc),它们可以启动所有 的系统服务。其中许多系统服务以守护(daemon)程序的形式实现,守护程序仅在后台运行,没有任何用户接口 (User Interface)。这样,即使我们没有登录系统,至少系统也在忙于执行一 些例行事务。[1]

在进程方案中,一个程序可以发动另一个程序被表述为一个父进程可以产生一个子进程。

内核维护每个进程的信息,以此来保持事情有序。例如,系统分配给每个进程一个数字,这 个数字叫做进程 (process) ID 或 PID。PID 号按升序分配,init 进程的 PID 总是 1。内核也对 分配给每个进程的内存和就绪状态进行跟踪以便继续执行这个进程。

#ps

ps全称process status

1
2
3
4
$ ps
PID TTY TIME CMD
11583 pts/0 00:00:00 bash
11600 pts/0 00:00:00 ps

默认情况下,ps 不会显示很多进程信息,只是列出与当前终端会话相关的进程。

TTY 是 “Teletype”(直译电传打字机) 的简写,是指进程的控制终端。
TIME 字段表示进程所消耗的 CPU 时间数量。

加上 x 选项,告诉 ps 命令,展示所有进程,不管它们由什么终端(如果有的话)控制。

在 TTY 一栏中出现的?,表示没有控制终端。

1
2
3
4
5
6
7
$ ps x
PID TTY STAT TIME COMMAND
784 ? Ss 0:00 /lib/systemd/systemd --user
785 ? S 0:00 (sd-pam)
12071 ? S 0:00 sshd: deploy@pts/0
12072 pts/0 Ss 0:00 -bash
12082 pts/0 R+ 0:00 ps x

输出结果中,新添加了一栏,标题为 STATSTAT 是 “state” 的简写,它揭示了进程当前状态:

R: 运行中。这意味着,进程正在运行或准备运行。
S: 正在睡眠。进程没有运行,而是,正在等待一个事件,比如 说,一个按键或者网络分组。
D: 不可中断睡眠。进程正在等待 I/O,比方说,一个磁盘驱动 器的 I/O。
T: 已停止. 已经指示进程停止运行。稍后介绍更多。
Z: 一个死进程或“僵尸”进程。这是一个已经终止的子进程, 但是它的父进程还没有清空它。(父进程没有把子进程从进程表中删除)
<: 一个高优先级进程。这可能会授予一个进程更多重要的资 源,给它更多的 CPU 时间。进程的这种属性叫做 niceness。 具有高优先级的进程据说是不好的(less nice),因为它占用了比较多的 CPU 时间,这样就给其它进程留下很少时间。
N: 低优先级进程。一个低优先级进程(一个“nice”进程)只有 当其它高优先级进程被服务了之后,才会得到处理器时间。

不过我的系统里有SsR+之类的,在书里没有。

还有一个选项aux

1
2
3
4
5
USER       PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
root 1 0.0 0.4 225444 8820 ? Ss Jun12 7:55 /lib/systemd/systemd --system --deserialize 19
root 2 0.0 0.0 0 0 ? S Jun12 0:00 [kthreadd]
root 4 0.0 0.0 0 0 ? I< Jun12 0:00 [kworker/0:0H]
root 6 0.0 0.0 0 0 ? I< Jun12 0:00 [mm_percpu_wq]

USER: 用户 ID. 进程的所有者。
%CPU: 以百分比表示的 CPU 使用率。
%MEM: 以百分比表示的内存使用率。
VSZ: 虚拟内存大小。
RSS: 进程占用的物理内存的大小,以千字节为单位。
START: 进程启动的时间。若它的值超过 24 小时,则用天表示。

#top

默认情况下,top每三秒钟更新一次。

1
2
3
4
5
6
7
top - 19:25:51 up 170 days,  1:13,  1 user,  load average: 0.00, 0.00, 0.00
Tasks: 89 total, 1 running, 57 sleeping, 0 stopped, 0 zombie
%Cpu(s): 0.3 us, 0.7 sy, 0.0 ni, 99.0 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st
KiB Mem : 2041216 total, 143632 free, 672572 used, 1225012 buff/cache
KiB Swap: 969964 total, 969964 free, 0 used. 1157724 avail Mem

PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND

top:程序名。
19:25:51:当前时间。
up 170 days, 1:13:这是正常运行时间。它是计算机从上次启动到现在所运行的时间。
1 user:登录系统用户数。
load average: 0.00, 0.00, 0.00:加载平均值。等待运行的进程数目,也就是说,处于可以运行状态并共享 CPU 的进程个数。第一个是最后 60 秒的平均值,下一个是前 5 分钟的平均值,最后一个是前 15 分钟的平均值。若平均值低于1.0,则指示计算机工作不忙碌。
Tasks:总结了进程数目和这些进程的各种状态。
Cpu(s):描述了 CPU 正在进行的活动的特性。
us:用户进程。
sy:系统(内核)进程。
ninice(低优先级)进程。
idCPU空闲率。
wa:等待I/O
hi:硬件中断。
si:软件中断。
st:cpu cycle 被虚拟化偷走的比例。
Mem:物理内存的使用情况。
Swap:交换分区(虚拟内存)的使用情况。

h命令显示帮助。
q退出top命令。

#&

在命令后加&后台执行:

1
command &

  1. init进程的进程号是1,但好像Ubuntu 18.04之后开始用systemd作为初始进程了。 ↩︎