编程与开发 · 第 19 期

进程与作业,ps/top/jobs 看懂你在跑什么

程序是文件,进程是运行中的实例

程序是文件,进程是运行中的实例。ps 看快照、top 看动态、jobs 看后台作业。理解进程树才知道谁生了谁、谁卡了谁。一个僵尸进程能拖垮系统,一个孤儿进程能跑飞。看懂进程树,才算看懂系统在干什么。
⏱ 约 10 分钟 🎯 用 ps/top 但只看 PID 的人 📦 源:linux-command §6

01一个反共识:进程不是程序,是程序的"一次运行"

很多人混用"程序"和"进程"。其实它们是两个东西:程序是磁盘上的文件(静态),进程是程序加载进内存跑起来的实例(动态)。

程序 = 文件(一个)→ 进程 = 实例(可多个)
一个 chrome 程序能开 N 个 chrome 进程,每个标签页一个

所以 ps 列的是进程不是程序,kill 杀的是进程不是程序(杀进程不删程序文件)。一个程序能同时跑多个进程(多开),一个进程只对应一个程序。理解这条,你就懂了为什么"关了浏览器标签页还有 chrome 进程"——因为不是所有进程都随标签关,有些后台进程独立。进程是操作系统调度的单位,程序只是它的来源。

程序是文件,
进程是一次运行。
灏天文库 · 编程与开发 P.57

02进程树演示:点进程看父子关系

下面是一棵进程树。点任意进程,看它的 PID、父进程、状态,以及僵尸/孤儿等特殊情况。

🌳 进程树演示
点进程节点看详情。注意僵尸进程(红虚线)和孤儿进程(黄)。
← 点上面的进程节点看详情
ps -efps auxtopjobspstree -pkill PID

03僵尸与孤儿:两种"死得不干净"的进程

进程有两种异常状态,新手常分不清:

僵尸 Zombie

子死父不收尸

子进程退出了,但父进程没调用 wait() 读它的退出码。进程表里还占着位(PID+退出码),不占内存但占 PID。多了会耗尽 PID。

孤儿 Orphan

父死子被收养

父进程先死了,子进程被 init(PID 1)收养继续跑。本身不是 bug,但如果是后台任务可能"跑飞"没人管。

僵尸的解法不是杀僵尸(它已经死了),而是杀或重启它的父进程——父进程被杀后,僵尸变孤儿,init 会自动收尸。所以看到一堆僵尸进程,先 ps -o ppid= -p 僵尸PID 找它爹,再处理爹。孤儿则要靠监控(systemd/supervisor)来管,别让进程脱离监管自己跑。僵尸是爹的锅,孤儿是没监护人的锅。

杀僵尸要杀爹,
不是杀僵尸本身。
灏天文库 · 编程与开发 P.58

04ps vs top vs jobs:三个命令各看什么

这三个命令常被混用,其实各管一摊:

关键区别:ps/top 看系统所有进程,jobs 只看当前 shell 的后台作业。一个守护进程(如 nginx)在 ps 里能看到,但不在 jobs 里——它不是你 shell 的作业。所以"我 jobs 看不到那个进程"不是 bug,是 jobs 的设计范围。排查时按需选:系统级用 ps/top,自己 shell 的后台任务用 jobs。

05带走这套清单

✅ 进程与作业 6 条可执行规则

  1. 程序是文件,进程是一次运行:一个程序可开多个进程。
  2. ps 看快照、top 看动态、jobs 看当前 shell 后台作业,各管一摊。
  3. 进程树看父子:pstree -p 或 ps -ef 的 PPID 列。
  4. 僵尸进程杀爹不杀僵尸:父进程死后 init 自动收尸。
  5. 孤儿进程靠监控管:systemd/supervisor 别让进程脱离监管。
  6. 系统级排查用 ps/top,自己 shell 后台任务用 jobs,别混用。
看懂进程树,
才算看懂系统在干嘛。
灏天文库 · 编程与开发 P.59