前言

服务卡了、CPU 飙了、进程僵了——处理这些问题的第一步永远是"看清进程现场"。这篇梳理进程查看、信号机制和后台任务管理的核心知识。

一、查看进程:ps

# 查看当前终端的进程
ps

# 查看系统全部进程(两种风格等价)
ps aux            # BSD 风格
ps -ef            # System V 风格

ps aux 各列含义:

USER  PID %CPU %MEM    VSZ   RSS TTY  STAT START TIME COMMAND
root    1  0.0  0.3 175364 13568 ?    Ss   10:00 0:05 /usr/lib/systemd/systemd
列 含义
PID 进程 ID(PPID 为父进程)
%CPU / %MEM CPU、内存占用
RSS 实际占用物理内存
STAT 进程状态
TIME 累计 CPU 时间

STAT 常见值:

符号 含义
R 运行中 / 等待 CPU
S 可中断睡眠(等待事件,大多数服务都处于此态)
D 不可中断睡眠(通常在等 IO,大量 D 态要警惕磁盘问题)
Z 僵尸进程(已退出但未被父进程回收)
T 已停止
s 会话首进程;l 多线程;< 高优先级;N 低优先级

实用组合:

# 查看某服务的进程树
ps -ef --forest | grep -A5 nginx

# 按内存排序取前 10
ps aux --sort=-%mem | head -11

# 找出 CPU 占用前 10
ps aux --sort=-%cpu | head -11

# 查看进程的启动目录和完整命令
ls -l /proc/<PID>/cwd
cat /proc/<PID>/cmdline | tr '\0' ' '

二、动态监控:top 与 htop

top

关键快捷键(进入 top 后按):

按键 作用
P 按 CPU 排序
M 按内存排序
1 展开每个 CPU 核心的使用率
c 显示完整命令行
k 杀进程(输入 PID)
q 退出

load average 三个数字分别是 1/5/15 分钟的平均负载。经验法则:负载持续超过 CPU 核心数说明机器忙不过来了。

# 一次性的负载快照
uptime
nproc       # CPU 核心数

# 更好用的 htop(有颜色、可交互、支持鼠标)
dnf install -y htop

三、信号与 kill

kill 不是"杀死"那么简单,它本质是给进程发信号。

# 默认发 SIGTERM(15): 优雅终止, 进程可以捕获并做清理
kill 1234

# 强制杀死: SIGKILL(9), 进程无法捕获, 直接蒸发(可能留下残留资源)
kill -9 1234

# 发送自定义信号
kill -HUP 1234        # 很多服务用它重载配置(如 nginx)
kill -USR1 1234

# 按名字杀
pkill -f "python app.py"
killall nginx

# 列出所有信号
kill -l

常用信号速查:

信号 编号 含义
SIGTERM 15 优雅终止(默认)
SIGKILL 9 强制终止(不可捕获)
SIGHUP 1 挂断;常被复用为"重载配置"
SIGINT 2 Ctrl+C 中断
SIGSTOP/T 19/20 暂停进程
SIGCONT 18 恢复运行
SIGUSR1/2 10/12 用户自定义信号

⚠️ 生产环境优先 kill(TERM),给进程优雅退出的机会;kill -9 是最后手段——它不给应用任何清理资源的机会,数据库类进程慎用。

四、前后台任务管理

# 把前台命令放后台运行(加 &)
./server &

# Ctrl+Z 暂停前台任务后, 转入后台继续
bg

# 查看当前终端的后台任务
jobs

# 调回前台
fg %1

# 让进程脱离终端会话, 关掉 SSH 也继续活着
nohup ./server >server.log 2>&1 &
disown -h %1            # 补救: 已启动的任务去掉 SIGHUP 关联

五、实战:排查一个 100% CPU 的进程

# 1. 找到元凶
top                        # 按 P 排序, 记下 PID, 假设是 8642

# 2. 看它到底在跑什么
cat /proc/8642/cmdline | tr '\0' ' '; echo
ls -l /proc/8642/cwd

# 3. 如果是自己的程序, 看看线程级热点
top -H -p 8642             # -H 显示线程

# 4. 确认无误后处理
kill 8642                  # 先礼后兵
kill -9 8642               # 仍不退出再强杀

小结

  • ps aux --sort=-%cpu / top 是定位资源问题第一现场
  • STAT 里 D 堆积查磁盘、Z 堆积查父进程
  • kill(TERM)优先,kill -9 兜底
  • 长任务记得 nohup ... & 脱离终端

本文是「Linux 基础」系列第 4 篇,下篇预告:Golang 开发环境搭建。