Linux 排障命令速查表 - 系统故障排查常用命令大全

服务器出问题时,可靠做法不是回忆某条命令,而是按固定顺序下钻:进程、端口、磁盘、内存、日志。这张表就是那条顺序。进程与负载一组从 uptime 入手——注意 Linux 的 load average 统计的是可运行与不可中断进程数,不是 CPU 百分比——再用 top 排序定位元凶,最后用 ps 拿 PID。端口与网络一组用 ss 与 netstat 查监听、nc 探连通性、dig 与 curl 区分端口不通还是上层服务异常。磁盘与内存一组用 df -h、du -sh 逐层定位大目录、iostat 与 free -m 判断压力在 IO 还是内存。表里标了几处易误判:磁盘满却找不到大文件,多半是进程仍持有已删文件的句柄,靠 lsof +L1 定位后重启;kill 默认发 SIGTERM,卡死再考虑 -9。

系统与运维·共 20 条命令·最后更新 2026-07-21

进程与负载 5

top -c
实时查看进程和负载,c 显示完整命令
ps aux --sort=-%cpu | head
按 CPU 排序看占用最高的进程
ps aux --sort=-%mem | head
按内存排序找内存大户
kill -9 <pid>
强制杀进程,先用普通 kill 不行再上 -9
uptime
快速看 1/5/15 分钟平均负载

端口与网络 5

ss -tlnp
列出监听中的 TCP 端口和对应进程
ss -tlnp | grep :8080
查指定端口被谁占用
curl -v http://127.0.0.1:8080
验证本地服务是否可达,看握手细节
ping -c 4 host
发 4 个 ICMP 探测包查看丢包和往返延迟,判断主机是否可达、链路是否抖动
dig +short example.com
快速查 DNS 解析结果

磁盘与内存 5

df -h
查看各分区磁盘使用率
du -sh * | sort -rh | head
找当前目录下最占空间的子项
free -h
查看内存和 swap 使用情况
lsof +L1
找已删除但仍被进程占用的文件(磁盘满却找不到大文件时用)
iostat -x 1
查看磁盘 IO 压力,需 sysstat

日志与服务 5

journalctl -u nginx -n 200 --no-pager
查看 systemd 服务最近日志
journalctl -f
实时跟踪系统日志
systemctl status nginx
查看服务状态和最近几行日志
tail -f /var/log/app.log
跟踪应用日志文件
dmesg -T | tail
查看内核消息,排查 OOM、硬件错误

命令示例

先看负载:uptime 的三个数字分别对应多长的时间窗

uptime

三个数字依次是最近 1、5、15 分钟的平均负载,是任务数不是百分比。1 分钟值明显高于 15 分钟值说明压力刚刚起来;三个值都高则是持续饱和。

输出

 14:32:11 up 12 days,  3:07,  2 users,  load average: 1.52, 1.18, 0.94

磁盘满的两种形态:df 看总量,du 找大户

df -h du -sh * | sort -rh | head

df 是文件系统视角,只看总量;du 是目录视角,能排序出大户。两者加起来的差额如果很大,说明空间被已删除但仍被打开的文件占着,这时改用 lsof +L1。

输出

Filesystem      Size  Used Avail Use% Mounted on
/dev/vda1        40G   39G  1.0G  98% /
/dev/vdb1       200G  148G   52G  74% /data
24G	./build
11G	./node_modules
3.1G	./logs

确认端口归属:ss 过滤 + PID 交叉验证

ss -tlnp | grep :8080

没有输出就是没人监听。有输出时先看 users 段里的进程名和 PID,再用 top -c 或 ps 确认这个 PID 确实是预期的服务,而不是某个临时开的调试进程。

输出

LISTEN 0      511          0.0.0.0:8080      0.0.0.0:*    users:(("node",pid=20481,fd=20))

内存还是 IO:free 看余量,dmesg 看是否被 OOM 杀过

free -h dmesg -T | tail

free 的 available 才是真正可用的量,free 本身小不代表内存紧张。若 dmesg 出现 OOM 记录,说明进程是被内核杀的,去查内存上限与泄漏;若 dmesg 干净但负载仍高,方向转向 iostat -x 1 的磁盘饱和。

输出

               total        used        free      shared  buff/cache   available
Mem:            7.7Gi       6.1Gi       321Mi        12Mi       1.3Gi       1.1Gi
Swap:          8.0Gi       2.4Gi       5.6Gi

[Sat Oct  4 02:11:07 2026] Out of memory: Killed process 20481 (node) total-vm:8123456kB, anon-rss:5201440kB

常见坑与注意事项

  • kill -9 发的是 SIGKILL,进程没有任何机会释放文件锁、刷盘或关闭连接,状态类服务强杀后重启会丢未落盘的数据;先用普通 kill,给足优雅退出时间。
  • load average 高不等于 CPU 不够:不可中断的 IO 等待也计入负载,先用 iostat -x 1 排除磁盘饱和再决定要不要加机器。
  • lsof +L1 扫全机文件句柄,进程数很多时开销不小;磁盘告警时用完立刻 Ctrl-C,别把它挂成常驻轮询。
  • journalctl -f 与 tail -f 都是持续占用终端的跟随命令;排查完用 Ctrl-C 退出,否则在无输出的机器上很容易被误判成命令卡死。
  • df 显示的是所有用户可用的文件系统视角,vda 挂载点写满时系统日志可能同时写不进去,出现服务「莫名重启」时要把磁盘和日志同时排查。

提示

  • 磁盘显示满了却找不到大文件,多半是进程占着已删除文件,用 lsof +L1 定位后重启进程。
  • kill 默认发 SIGTERM 让进程优雅退出,先试普通 kill,确认卡死再 kill -9。
  • dmesg 里出现 "Out of memory: Killed process" 说明是 OOM,不是程序自己崩的。
  • ss -s 一行输出汇总本机 socket 统计,负载高时先看它能快速判断连接数是否已接近文件描述符上限。
  • journalctl -p err -S "1 hour ago" --no-pager 直接列出最近一小时内的错误级日志,比翻完整日志再 grep 快得多。
  • iostat -xz 1 输出的 %util 接近 100 表示磁盘饱和,此时加 CPU 并不会变快,先定位是哪个进程在写盘。

常见问题

uptime 显示负载很高,但 top 里 CPU 几乎空闲,这矛盾吗?

不矛盾。Linux 的 load average 统计的是「可运行任务数 + 不可中断(通常卡在 IO)的任务数」,不是 CPU 占用百分比。当某个进程长时间阻塞在磁盘 IO 上,它会一直算在负载里,而 CPU 在等它,反而闲着。所以负载高、CPU 空的第一嫌疑不是算力不足,而是存储响应慢——接着用 iostat -x 1 看队列深度和 %util 才能定性。

怎么确认某个端口到底有没有人在听,以及是谁在听?

两步。第一步用 ss -tlnp | grep :8080 过滤出该端口的监听行,-l 只看监听态、-t 只看 TCP、-n 不做名字解析、-p 把占用进程列出来;命令没有任何输出就说明当前没有进程监听这个端口,服务侧的假设直接被排除。若有输出,再看 -p 列出的进程名与 PID 是否就是你预期的那个服务。

端口在监听,curl 本地地址却连不上,下一步该看什么?

端口占用问题已经排除,改查握手细节。curl -v http://127.0.0.1:8080 会把完整的请求与响应过程打出来:看它是否停在 TLS 握手、是否在发出请求行后就断开、响应状态码是多少。这三种形态指向完全不同的原因——握手卡住多为协议或证书问题,连接被立即重置多为应用进程内部异常或未处理的连接钩子,能拿到响应但状态异常则是应用层逻辑问题。

df 显示分区满了,可 du 怎么都找不到大文件?

这是典型的「空间被已删除文件占住」。某个进程打开文件后文件被删了,inode 与数据块要等进程关闭句柄才释放,所以 df 看着满,du 却查不到。定位用 lsof +L1,它专门列出链接数为 0 或 1、且仍被进程打开的已删除文件。找到后重启对应进程(先普通 kill,确认卡死再 kill -9),空间立即归还;若是长期跑的服务,要顺手查清是谁在持续写日志或写完不删。

服务毫无征兆地消失了,dmesg 里该找什么?

找内核层面的终止记录。dmesg -T | tail 会把内核环形缓冲区按人类可读的时间输出接到最后几行,如果出现 Out of memory: Killed process 一类的记录,说明是内核 OOM killer 主动杀掉了进程,而不是程序自己崩的——这种情况特征很明显:被杀的是内存占用最高的那个进程,dmesg 里同时能看到内存分配失败的记录。这时该处理的是内存上限或泄漏,而不是去查应用日志。

官方参考来源

下方为命令对应的官方权威文档,供你核对最新用法与深入查阅。

由 巧匠 维护

公开更新于 2026年7月21日,内容持续校对官方文档。

联系我们

命令或描述有误?提交反馈、商务合作或产品建议都可发送邮件给我们。

联系我们