前言
服务卡了、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 开发环境搭建。