Linux 命令实战 · 第 6 章 进程、作业与性能观测 章节摘要:到这一章,我们把视角从「文件」转到「正在运行的程序」——进程。本章要把三件事讲透。第一是进程状态机:一个进程从「运行」到「就绪」到「睡眠」到「僵尸」的生命周期,理解了它,你才能读懂 / 输出里那一列 ,也才能理解「为什么 后进程有时还在」。第二是信号: 不是「杀死」,而是「发信号」——SIGTERM 是请求、SIGKILL 是强杀、SIGHUP 是重载,理解信号,你才懂得优雅退出与强制终止的差别。第三是文件描述符:每个进程打开的文件都是一个整数句柄, 能告诉你「端口被谁占了、文件被谁锁了」。这三件事合起来,就是排查「服务起不来、端口被占、CPU 跑满、僵尸进程堆积」这类生产问题的全套工具。
章节摘要:到这一章,我们把视角从「文件」转到「正在运行的程序」——进程。本章要把三件事讲透。第一是进程状态机:一个进程从「运行」到「就绪」到「睡眠」到「僵尸」的生命周期,理解了它,你才能读懂
ps/top输出里那一列STAT,也才能理解「为什么kill后进程有时还在」。第二是信号:kill不是「杀死」,而是「发信号」——SIGTERM 是请求、SIGKILL 是强杀、SIGHUP 是重载,理解信号,你才懂得优雅退出与强制终止的差别。第三是文件描述符:每个进程打开的文件都是一个整数句柄,lsof能告诉你「端口被谁占了、文件被谁锁了」。这三件事合起来,就是排查「服务起不来、端口被占、CPU 跑满、僵尸进程堆积」这类生产问题的全套工具。读完本章,你不再是「kill -9一把梭」,而是能精准诊断每个进程在做什么。
阅读完本章,你应当能够:
ps aux 与 ps -ef 两套输出,理解 BSD 风格(无横杠)与 System V 风格(带横杠)的差异。top/htop 的输出,重点理解 %CPU、%MEM、STAT(R/S/D/Z/T)各列含义。kill/killall/pkill 发送信号,区分 SIGTERM(请求退出)、SIGKILL(强制)、SIGHUP(重载),理解为什么优先用 SIGTERM。jobs/bg/fg/nohup/& 管理后台作业,理解 nohup 解决的是「终端关闭导致 SIGHUP」问题。free、uptime、vmstat 观测系统整体资源,区分「实际内存」与「含缓冲/缓存的占用」。lsof 排查「端口被谁占、文件被谁锁」,理解文件描述符(fd)是进程与资源之间的句柄。strace 追踪进程的系统调用,定位「卡在哪一步」的疑难问题。进程排查的三大坐标:它在什么状态(STAT)、它收到了什么信号(信号)、它打开了什么资源(fd)。三者合起来,几乎能解释所有「进程行为异常」的问题。
ps 两套风格ps aux(BSD 风格,无横杠)与 ps -ef(System V 风格,带横杠)的差异,以及 ps -eLf(看线程)、ps aux --sort=-%cpu 按字段排序。重点解读 STAT 列的每个字母。
top、htoptop 是终端里的「任务管理器」。讲清它的分区(系统负载概览 + 进程列表)、%CPU/%MEM/STAT/TIME+ 各列含义、交互键(P 按 CPU 排序、M 按内存、k 杀进程、1 看每核)。htop 作为更友好的升级版。
进程的完整生命周期:运行(R)、睡眠(S)、不可中断睡眠(D)、停止(T)、僵尸(Z)。重点讲「僵尸进程」是怎么产生的(子进程结束但父进程没回收)以及它为什么占资源少却危险。
kill、killall、pkillkill 不是「杀」,而是「发信号」。讲清常用信号(SIGTERM=15 默认、SIGKILL=9 强杀、SIGHUP=1 重载、SIGINT=2 Ctrl+C),为什么优先 SIGTERM(给程序清理机会),以及 killall/pkill 按名匹配的便利与风险。
jobs、bg、fg、nohup、&& 放后台、Ctrl+Z 暂停、bg/fg 切前后台、jobs 看作业表。重点讲 nohup 解决的是「终端关闭时 Shell 给所有子进程发 SIGHUP」的问题,以及为什么生产环境应该用 systemd 而非 nohup。
free、uptime、vmstatfree -h 看内存(区分 used/free/buff/cache,强调「可用」要看 avail)、uptime 看负载均衡(三个数字=1/5/15 分钟平均负载)、vmstat 看虚拟内存与上下文切换。
lsoflsof 是「谁占着资源」的万能工具。三个高频用法:lsof -i :80(端口被谁占)、lsof +D /path(目录被谁锁)、lsof -p PID(某进程打开了什么)。讲清文件描述符是这一切的基础。
strace、ltracestrace 是「最后救命」的排查工具:它打印进程的每个系统调用。讲清 -p PID(挂到运行中进程)、-e trace=open,read(过滤)、-f(跟踪子进程),以及用它定位「程序卡在读哪个文件」的经典场景。
本章遵循「看 → 读懂状态 → 终止 → 后台 → 系统观测 → 归属排查 → 深度追踪」的递进路径:
ps (01) ── 先"拍快照"看有哪些进程 │ ▼ top/htop (02) ── 再"实时看" │ ▼ 进程状态机 (03) ── 读懂 STAT, 理解僵尸 │ ▼ kill/信号 (04) ── 知道怎么终止它 │ ▼ jobs/nohup (05) ── 知道怎么把它放后台 │ ▼ free/uptime (06) ── 抬到系统级资源观测 │ ▼ lsof (07) ── 排查"端口/文件被谁占" │ ▼ strace (08) ── 最后救命:看每个系统调用 │ ▼ 第 7 章:从"本机进程"延伸到"网络连通"
前三节是「看见与读懂」,中间两节(04-05)是「控制」,后三节(06-08)是「观测与深度排查」。strace(08)是难度最高的工具,但也是「所有常规手段都失败时」的终极武器。lsof(07)与 strace(08)共同依赖「文件描述符」这个底层概念。
前置知识:
本章为后续章节奠定的基础:
systemctl stop/restart 本质就是发信号)的基础lsof -i :80 是第 7 章(网络)里排查端口问题的标准手段