实验环境里的 crow 账号已经配置了 sudo 权限。在命令前加上 sudo,就能临时以超级管理员(root)身份执行安装软件、创建账号或管理系统服务等操作。
注意
本模块包含四个实验练习,每个实验都会启动一台独立的实验机。提交答案后实例不会自动销毁,请跟着正文做完对应的操作练习,结束时再手动关闭环境。
进入终端后,先确认当前身份和权限:
crow@opsbox:~$ whoami
crow
crow@opsbox:~$ hostname
opsbox
crow@opsbox:~$ sudo whoami
root
crow@opsbox:~$ whoami
crow
sudo whoami 会以 root 身份执行单条命令,因此输出 root;执行完后,终端依然保持普通的 crow 身份。运行 sudo -l 可以查看当前账号被授予的 sudo 权限范围。

程序文件与进程
存放在磁盘上的文件(比如 /usr/bin/sleep)只是一份静态的二进制代码。当我们在终端输入命令回车执行时,内核把代码读进内存,分配独立的虚拟内存空间、文件描述符表和运行上下文,这就产生了一个正在运行的进程(Process)。
如果在两个终端窗口里分别执行 sleep 300,系统就会基于同一份程序文件创建两个互不干扰的进程。内核会给每个进程分配唯一的正整数编号,称为进程 ID(PID)。Linux 中的所有进程构成一棵以初始化进程(PID 1,现代发行版中通常为 systemd)为根的进程树,新进程都是由现有父进程派生出来的。

为了看清后台进程的生命周期,我们先拿系统自带的 sleep 300(休眠等待 300 秒)做实验。在命令末尾加上 &,可以让程序直接在后台运行,不占用当前终端:
crow@opsbox:~$ sleep 300 &
[1] 2140
crow@opsbox:~$ ps -p 2140 -o pid,ppid,user,stat,comm
PID PPID USER STAT COMMAND
2140 2100 crow S sleep
注:这里的 PID 2140 只是示例,实际操作时请换成你终端里输出的编号。
ps(Process Status)用于查看当前进程快照。-p 指定要看的 PID,-o 自定义输出的字段列:
| 列名 | 含义 |
|---|
| PID | 进程的唯一编号 |
| PPID | 创建该进程的父进程编号(Parent PID,这里就是当前的 bash 终端) |
| USER | 进程的运行用户身份(决定该进程能访问哪些文件) |
| STAT | 进程当前的运行状态码 |
| COMMAND | 进程运行的命令名称 |
STAT 列首字母代表进程的五种常见状态:
R(Running / Runnable):正在 CPU 上执行,或在运行队列中排队等待调度。
S(Interruptible Sleep):可中断睡眠。进程正在等待某个事件(如网络数据包到达、终端输入或定时器到期),事件发生或收到信号就会唤醒。绝大多数空闲后台服务都处于 S 状态。
D(Uninterruptible Sleep):不可中断睡眠。通常在等待底层磁盘或网络存储 I/O 返回,期间连强制信号也无法立即打断。如果大量进程卡在 D 状态,往往说明磁盘读写出现瓶颈或故障。
T(Stopped):暂停或被跟踪状态。进程收到了暂停信号(如 SIGTSTP),等待收到继续信号后再恢复。
Z(Zombie):僵尸进程。进程已经执行完毕退出,但父进程还没调用 wait() 回收它的退出状态码,导致内核进程表里仍残留着一条空壳记录。
内核还会通过 /proc/<PID>/ 虚拟目录,把每个进程在内存里的实时信息映射成文件。排查可疑进程时,就算磁盘上的可执行文件被重命名或删掉了,也可以去 /proc/<PID>/ 目录下查看:
/proc/<PID>/cmdline:启动时的完整命令行参数(以空字符分隔,可用 tr '\0' ' ' 转换查看)。
/proc/<PID>/exe:指向磁盘上真实可执行文件的软链接。
/proc/<PID>/cwd:指向进程当前工作目录的软链接。
/proc/<PID>/fd/:包含该进程当前打开的所有文件描述符,能看到它打开了哪些日志、配置文件或网络套接字。
如果想按名字快速查找进程的 PID,可以用 pgrep:
crow@opsbox:~$ pgrep -a -u crow -x sleep
2140 sleep 300
其中 -u crow 限定只查 crow 用户的进程,-x sleep 要求精确匹配进程名 sleep,-a 同时打印完整命令行。结束进程前先用 pgrep 确认一眼,能避免误杀其他程序。
查看系统资源占用
在终端输入 top,可以打开全屏动态刷新的系统监控面板。按大写 P 按 CPU 占用排序,按大写 M 按内存占用排序,按 q 退出。

在 top 列表里找到刚才启动的 sleep,它的 %CPU 几乎一直是 0.0。排查服务器卡顿时,可以先用 top 看一眼到底是某个进程死循环占满了 CPU,还是大伙都在等待磁盘读写或网络响应。
另外两条常用命令可以快速查看内存与负载概况:
crow@opsbox:~$ free -h
crow@opsbox:~$ uptime
free -h:查看内存使用量。看剩余可用内存时重点看 available 列(包含了可随时回收的系统缓存 Buffer/Cache),而不是只看 free 列;
uptime:查看系统运行时长,以及最近 1、5、15 分钟的平均负载(Load Average),反映处于 R(运行/排队)和 D(等待磁盘 I/O)状态的平均进程数。
进入下一章前,先用 kill 把刚才后台运行的 sleep 进程停掉:
crow@opsbox:~$ kill 2140
crow@opsbox:~$ pgrep -a -u crow -x sleep
再次运行 pgrep 没有输出,说明进程已经退出。