Linux 运维必会:这些命令不会,排障效率至少慢一半
一、问题背景
我带过不少初中级运维工程师,发现一个普遍现象:很多新人面对故障时只会 top、df -h、free -m 三件套,看到不熟悉的输出就抓瞎。等他们查清楚问题,故障已经过了一个小时。
运维工程师的核心竞争力不是”会多少命令”,而是”看到现象后能在 5 秒内想到用什么命令”。这种反射弧来自大量的命令积累和实战练习。
我做了 8 年运维,从最开始的只会 ls、cd、cat,到后来能 5 分钟定位一个 OOM、3 分钟定位一个磁盘 I/O 瓶颈,靠的就是把常用命令练成了肌肉记忆。这篇文章把我日常排障必用的 50+ 个命令整理出来,按主题分类,给出”目的 → 关键参数 → 输出解读 → 实战片段 → 注意事项”的完整说明。
每一节都是可以直接照着操作的实战手册,不是教科书式的命令清单。学完这篇文章,你应该能做到:
-
看到 load average: 28.50, 30.10, 32.40立刻想到查 CPU -
看到业务慢立刻想到 vmstat+iostat组合 -
看到 No space left on device立刻想到df -i查 inode -
看到进程卡住立刻想到 strace -p或/proc/PID/wchan
二、适用场景
本文覆盖以下运维场景:
-
物理机 / 虚拟机 / 云服务器的日常运维 -
应用服务(Nginx / Tomcat / MySQL / Redis / Kafka)的进程级排查 -
CPU / 内存 / 磁盘 I/O / 网络四个维度的性能分析 -
进程状态 / 系统调用 / 内核事件追踪 -
文本处理 / 批量操作 / 自动化脚本 -
故障定位 / 根因分析 / 性能调优
不覆盖:
-
macOS 系统命令(BSD 风格,部分参数不同) -
Windows Server -
容器内部署的命令(容器内命令和宿主机基本一致,但资源限制、namespace 视角不同) -
大型分布式系统(Hadoop、Ceph、Kafka 集群)的运维命令
三、核心知识点
3.1 Linux 命令的”反射弧”
运维工程师要建立的第一类反射弧是”现象 → 命令”。下面是一些典型映射:
|
|
|
|---|---|
|
|
uptime
top / vmstat |
|
|
free -h
|
|
|
iostat -xz 2
iotop |
|
|
ss -lntp
mtr / tcpdump |
|
|
systemctl status
journalctl -u |
|
|
df -h
du -sh /* |
|
|
df -i |
|
|
journalctl -p err |
|
|
strace -p PID |
|
|
lsof -p PID |
3.2 命令的”风险等级”
运维命令按风险分四类:
- 安全级
(read-only): uptime、free、df、ss -s、ps - 观察级
(可能影响性能): strace、tcpdump、perf top - 修改级
(明确改变状态): systemctl restart、kill、iptables -I - 破坏级
(高风险): rm -rf、dd、mkfs、fdisk
任何命令执行前都要先判断它属于哪一级。破坏级命令必须有备份、有审批、有回滚。
3.3 重点目录速查
|
|
|
|---|---|
/proc/PID/ |
|
/proc/sys/ |
|
/proc/loadavg |
|
/proc/meminfo |
|
/sys/fs/cgroup/ |
|
/var/log/ |
|
/etc/systemd/system/ |
|
/sys/class/net/ |
|
熟悉这些目录能让你在系统启动不起来、工具命令都不可用时依然能排查。
四、整体命令使用思路
我习惯把命令按”目的”组织成 5 类:
- 状态查询类
:查看系统或进程当前状态 - 问题定位类
:根据状态进一步追踪根因 - 变更执行类
:修改配置或重启服务 - 批量处理类
:处理多个文件或进程 - 信息提取类
:从日志或输出中提取关键信息
每类命令的选择逻辑在下面章节展开。
五、进程类命令
5.1 ps:进程快照
目的:列出系统所有进程的状态。
关键参数:
ps aux # BSD 风格,所有进程
ps -ef # System V 风格
ps -eo pid,ppid,user,stat,pcpu,pmem,etime,comm,args --sort=-pcpu
输出解读:
USER
:进程运行用户 PID
:进程 ID %CPU
:CPU 占用率 %MEM
:内存占用率 STAT
:进程状态(R 运行、S 中断、D 不可中断睡眠、Z 僵尸、T 停止、I 空闲) START
:启动时间 TIME
:累计 CPU 时间 COMMAND
:启动命令
实战片段:
# 找占用 CPU 最高的 10 个进程
ps -eo pid,ppid,user,pcpu,pmem,comm --sort=-pcpu | head -11
# 找内存占用最高的 5 个进程
ps -eo pid,user,pmem,comm --sort=-pmem | head -6
# 找僵尸进程
ps -eo pid,ppid,stat,comm | awk '$3 ~ /Z/'
# 找运行超过 24 小时的进程
ps -eo pid,etime,comm | awk '$2 ~ /-/ {print}'
# 显示进程的命令行(完整)
ps -ef | grep <name> | grep -v grep
注意事项:
ps aux
在不同发行版的输出列顺序可能不同 STAT
列中的 D状态(不可中断睡眠)通常是 I/O 阻塞,要重点关注etime
显示进程运行时长(如 01:23:45或5-01:23:45),新版本支持-
Linux 3.x 内核后, ps默认只显示当前用户的进程,必须加a或x才显示所有
5.2 top:实时进程监控
目的:动态查看系统状态和进程信息。
关键参数:
top -b -n1 # 批处理模式,只跑一次,适合脚本
top -p <pid1>,<pid2> # 只监控指定进程
top -u <user> # 只看指定用户
top -H -p <pid> # 显示进程的线程
常用交互:
P
:按 CPU 排序 M
:按内存排序 T
:按累计 CPU 时间排序 1
:显示每个 CPU 核心 H
:显示线程 c
:显示完整命令行 k
:kill 进程 q
:退出
实战片段:
# 找出 CPU 最高的进程(结合 ps 用)
top -b -n1 -o %CPU | head -20
# 看 Java 进程的线程
top -H -p <pid>
# 看指定用户的进程
top -u www-data
注意事项:
top
交互模式下不要按 k误操作top -b -n1
比 ps慢,但能看到每个进程的实时 CPU 占用-
推荐用 htop替代默认top,更直观,支持鼠标
5.3 htop:top 的增强版
目的:比 top 更友好的交互式监控。
安装:
yum install -y htop
apt install -y htop
实战片段:
htop -d 5 # 5 秒刷新一次
htop -u www-data # 只显示指定用户
htop -p <pid> # 只显示指定进程
htop -t # 树形视图
注意事项:
-
htop 鼠标可点击,比 top 友好 -
颜色标记: D状态标红色,R状态标绿色 -
鼠标拖动显示树形关系
5.4 pidstat:进程级资源统计
目的:按时间间隔采样进程 CPU、内存、I/O 数据。
关键参数:
pidstat -p <pid> 2 5 # 每 2 秒采样 1 次,共 5 次
pidstat -u 2 5 # 所有进程 CPU
pidstat -r 2 5 # 内存
pidstat -d 2 5 # I/O
pidstat -w 2 5 # 上下文切换
实战片段:
# 监控 Java 进程的 CPU
pidstat -p <pid> 2 5 -u
# 监控 MySQL 进程的 I/O
pidstat -p $(pidof mysqld) 2 5 -d
# 看上下文切换最高的进程
pidstat -w 2 5 | head -20
注意事项:
-
pidstat 在 CentOS 7+ / Ubuntu 16+ 默认在 sysstat包里 -
比 top 适合在脚本里用,可以批量采样 -
pidstat -t 显示线程级数据
5.5 pstree:进程树
目的:以树形结构显示进程父子关系。
关键参数:
pstree -a # 显示命令行
pstree -p # 显示 PID
pstree -u # 显示用户切换
pstree -s <pid> # 显示指定进程的父链
实战片段:
pstree -ap | head
pstree -p <pid> | head
注意事项:
-
找不到父进程时显示 init或systemd(PID 1) -
进程很多时输出会很长,建议用 less查看
5.6 strace:追踪系统调用
目的:跟踪进程的系统调用和信号。
关键参数:
strace -p <pid> # 跟踪运行中的进程
strace -c -p <pid> # 汇总统计
strace -e trace=network,read,write -p <pid> # 只跟踪网络和读写
strace -f -p <pid> # 跟踪子进程
strace -T -p <pid> # 显示每个调用耗时
strace -tt -o /tmp/trace.log <cmd> # 启动并跟踪命令
实战片段:
# 看 Java 进程在做什么
strace -p <pid> -T -tt -e trace=network,read,write
# 统计某进程的系统调用类型
strace -c -p <pid>
# 启动 MySQL 并跟踪
strace -f -o /tmp/mysql-strace.log mysqld --user=mysql
注意事项:
strace
会显著降低进程性能(5%-30%),不要在生产高负载机器上用 -
strace 输出可能很大,建议 strace ... 2>&1 | tee /tmp/strace.log strace
需要 ptrace 能力,容器默认没有 -
跟踪的进程如果是 root 运行,strace 必须也是 root -c
模式按 Ctrl+C 退出时打印汇总
5.7 lsof:列出打开的文件
目的:查看进程打开的文件、socket、管道等。
关键参数:
lsof -p <pid> # 进程打开的所有文件
lsof -i :80 # 占用 80 端口的进程
lsof /var/log/messages # 谁在写这个文件
lsof -u <user> # 指定用户打开的文件
lsof +D /var/log # 目录下所有被打开的文件(递归)
lsof -i -P -n # 显示 TCP/UDP 连接
实战片段:
# 看 80 端口被谁占用
lsof -i :80
# 看 /var/log/messages 谁在写
lsof /var/log/messages
# 看进程打开的网络连接
lsof -p <pid> -i -P -n
# 看谁在删日志
lsof +D /var/log | grep deleted
注意事项:
lsof
输出可能很大,加 | head或| grep+D
目录递归比较慢,大目录慎用 lsof -i
比 ss -lntp信息更详细
5.8 /proc/PID/*:进程运行时信息
目的:直接通过文件系统查看进程信息。
关键路径:
/proc/<pid>/cmdline # 命令行
/proc/<pid>/cwd -> /path # 当前工作目录
/proc/<pid>/environ # 环境变量
/proc/<pid>/fd/ # 打开的文件描述符
/proc/<pid>/maps # 内存映射
/proc/<pid>/status # 进程状态
/proc/<pid>/stat # 进程统计
/proc/<pid>/statm # 内存统计
/proc/<pid>/wchan # 进程在哪个内核函数中睡眠
/proc/<pid>/limits # 资源限制
实战片段:
# 看进程的命令行(tr 处理 NUL 字符)
cat /proc/<pid>/cmdline | tr'\0'' '; echo
# 看进程的环境变量
cat /proc/<pid>/environ | tr'\0''\n'
# 看进程打开的文件描述符
ls -la /proc/<pid>/fd/ | head
# 看进程在哪个内核函数中睡眠(卡住时)
cat /proc/<pid>/wchan
echo
# 看进程的状态
cat /proc/<pid>/status
# 看进程的内存映射
cat /proc/<pid>/maps | head
# 看进程的资源限制
cat /proc/<pid>/limits
注意事项:
/proc/PID/fd/
是符号链接,指向真实的 fd -
进程被 kill 后这些文件会消失,所以要快 wchan
在很多发行版是空的(需要 root 才能看到符号名)
六、内存类命令
6.1 free:内存使用情况
目的:快速查看内存总量、已用、空闲、可用、缓存。
关键参数:
free -h # 人类可读
free -m # MB 单位
free -g # GB 单位
free -s 2 # 每 2 秒刷新
free -c 5 # 刷新 5 次
输出解读:
total used free shared buff/cache available
Mem: 64217 12832 1024 2048 50361 48876
Swap: 4095 128 3967
total
:总物理内存 used
:已用(包含 buff/cache) free
:完全空闲 shared
:共享内存(tmpfs 等) buff/cache
:块设备和页缓存,可回收 available
:真正可用的内存(free + 可回收 buff/cache)
实战片段:
# 关键看 available,不是 free
free -h
# 如果 available 接近 0,used 接近 total,内存才真不够
# 持续监控
watch -n 2 free -h
注意事项:
-
很多新人看到 free很小就以为内存不够,其实buff/cache是 Page Cache,可以随时回收 -
真正代表”还能分配多少内存”的是 available字段 -
不要被 buff/cache 大吓到,Linux 会自动用多余内存做缓存
6.2 /proc/meminfo:内存详情
目的:看更详细的内存信息。
实战片段:
# 看关键指标
grep -E 'MemTotal|MemFree|MemAvailable|Buffers|Cached|SwapTotal|SwapFree|Dirty|Writeback|AnonPages|Mapped|Shmem' /proc/meminfo
# 重点关注:
# Dirty: 等待写盘的脏页
# Writeback: 正在写盘的页
# AnonPages: 匿名页(堆、栈)
# Mapped: 映射的文件
# Shmem: 共享内存
注意事项:
/proc/meminfo
是 free 的底层数据源 Dirty
持续增长说明磁盘写入慢,可能有 I/O 瓶颈 AnonPages
大说明程序占用内存多
6.3 pmap:进程内存映射
目的:查看进程占用的内存分布。
关键参数:
pmap -x <pid> # 详细模式
pmap -d <pid> # 设备格式
pmap <pid> | sort -k2 -n -r | head # 按 RSS 排序
实战片段:
# 看 MySQL 进程的内存分布
pmap -x $(pidof mysqld) | sort -k3 -n -r | head -20
# 看 RSS 最大的内存段
pmap -x <pid> | awk 'NR>1 {print $2, $4}' | sort -k2 -n -r | head -10
注意事项:
pmap
输出很长,sort 后用 head 看大头 RSS
是常驻内存大小, Size是虚拟地址空间大小pmap
比 /proc/PID/maps友好
6.4 vmstat:虚拟内存统计
目的:综合看系统 CPU、内存、I/O、上下文切换。
关键参数:
vmstat 2 5 # 每 2 秒采样,共 5 次
vmstat -s # 一次性输出统计
vmstat -d # 磁盘统计
输出解读:
procs -----------memory---------- ---swap-- -----io---- -system-- ------cpu-----
r b swpd free buff cache si so bi bo in cs us sy id wa st
2 0 0 1024000 200000 5000000 0 0 1 20 500 1000 10 5 80 5 0
关键字段:
r
:等待运行的进程数(r > CPU 核数说明 CPU 满) b
:不可中断睡眠的进程数(I/O 阻塞) swpd
:已用 swap free
:空闲内存 si / so
:swap in / out bi / bo
:块设备 in / out in
:中断次数 cs
:上下文切换 us / sy / id / wa / st
:user / system / idle / iowait / steal
实战片段:
# 看 CPU 是不是 I/O 等待
vmstat 2 5
# 看 wa 字段,> 30% 说明 I/O 严重
# 看上下文切换
vmstat 2 5
# 看 cs 字段,> 100000/秒 可能有问题
# 看是不是被偷了 CPU(虚拟机)
vmstat 2 5
# 看 st 字段,> 10% 说明宿主机忙
注意事项:
vmstat
第一行是开机以来的平均值,没参考价值,从第二行看 r
队列长度持续 > CPU 核数就是 CPU 瓶颈 b
持续 > 0 说明有 I/O 阻塞 si / so
持续 > 0 说明物理内存不够
6.5 slabtop:内核 slab 缓存
目的:查看内核 slab 分配器的内存使用。
实战片段:
# 实时查看
slabtop -d 2
# 看 dentry(目录项)缓存
slabtop | head -20
# 看某个 slab 的细节
cat /proc/slabinfo | head -20
注意事项:
-
内核 slab 缓存持续增长可能是内核内存泄漏 dentry
缓存太多说明打开过很多文件 slabtop
默认安装,需要 procps包
七、CPU 类命令
7.1 uptime:系统负载
目的:快速看系统运行时间和 1/5/15 分钟负载。
实战片段:
uptime
# 14:23:11 up 32 days, 4:17, 3 users, load average: 0.15, 0.22, 0.18
输出解读:
load average
三个值分别对应 1 / 5 / 15 分钟的运行队列平均长度 -
健康负载 = CPU 核数以下 -
如果 1 分钟负载远高于 5 分钟和 15 分钟,故障刚发生 -
如果三个值都高,故障已经持续
注意事项:
-
负载高不一定是 CPU 满,也可能是 I/O 阻塞(看 iowait) -
经验值:load < CPU 核数 算健康,> 2× 核数算严重 nproc
看 CPU 核数
7.2 mpstat:多核 CPU 统计
目的:看每个 CPU 核心的使用情况。
关键参数:
mpstat -P ALL 2 5 # 所有核,每 2 秒采样 5 次
mpstat -I ALL 2 5 # 中断统计
mpstat -I CPU 2 5 # 中断按 CPU 聚合
实战片段:
# 看每核的 CPU 使用
mpstat -P ALL 2 5
# 看中断分布(网卡风暴时用)
mpstat -I ALL 2 5
# 看软中断
mpstat -I SCPU 2 5
注意事项:
mpstat
在 sysstat包里%usr
高 → 用户态进程占 CPU %sys
高 → 内核态忙(系统调用或内核 bug) %iowait
高 → I/O 阻塞 %steal
高(虚拟机)→ 宿主机资源被抢占 %soft
高 → 软中断风暴
7.3 sar:系统活动报告
目的:长期采样并记录系统活动,可以回看历史。
关键参数:
sar -u 2 5 # CPU
sar -r 2 5 # 内存
sar -d 2 5 # 磁盘
sar -n DEV 2 5 # 网络
sar -b 2 5 # I/O 速率
sar -q 2 5 # 队列长度
实战片段:
# 看 CPU 历史
sar -u
# 看昨天的 CPU 数据
sar -u -f /var/log/sa/sa01
# 看内存历史
sar -r
# 看网络流量历史
sar -n DEV
# 看磁盘历史
sar -d
注意事项:
sar
需要 sysstat包,配置/etc/sysstat/sysstat后定期采集sar
数据默认保留 7 天 sar -f
看历史某天的数据 -
sar 是排查”昨天故障”的最佳工具
7.4 perf:Linux 性能分析
目的:内核和应用的性能采样和追踪。
关键参数:
perf top # 实时热点
perf top -p <pid> # 指定进程
perf record -p <pid> -g # 采样 30 秒
perf report # 报告
perf stat -p <pid> sleep 5 # 5 秒内的硬件事件统计
实战片段:
# 看系统热点
perf top
# 采样 MySQL 进程 30 秒,看热点函数
perf record -p $(pidof mysqld) -g -- sleep 30
perf report
# 看 CPU 上下文切换
perf stat -e context-switches,cs,migrations -p <pid> sleep 5
注意事项:
perf
需要 linux-tools包perf
用 tracepoint和kprobe可以做深度分析perf top
在高负载机器上开销较大 -
容器内需要 --privileged或perf_event_open权限
八、磁盘 I/O 类命令
8.1 iostat:磁盘 I/O 统计
目的:看每块磁盘的读写速率、利用率、等待时间。
关键参数:
iostat -xz 2 5 # 扩展模式,每 2 秒采样 5 次
iostat -m 2 5 # MB 单位
iostat -d sda 2 5 # 只看 sda 磁盘
iostat -p ALL 2 5 # 显示分区
输出解读:
Device r/s w/s rkB/s wkB/s await svctm %util
sda 1.20 5.50 50.0 200.0 2.5 0.5 0.5
r/s
/ w/s:每秒读写次数rkB/s
/ wkB/s:每秒读写字节数await
:平均每次 I/O 等待毫秒数(队列 + 服务时间) svctm
:平均每次 I/O 服务毫秒数(基本不再用) %util
:设备利用率(饱和度)
实战片段:
# 找 I/O 瓶颈磁盘
iostat -xz 2 5
# 关键看:
# %util > 60% 算繁忙
# await > 10ms(机械盘)算有问题
# await > 1ms(SSD)算有问题
注意事项:
%util
接近 100% 说明设备饱和 await
飙升但 %util不高,可能是 RAID 卡或 SAN 问题iostat
第一行是开机以来的平均值,没参考价值 %util
在 SSD 上意义不大,主要看 await
8.2 iotop:进程级 I/O 监控
目的:找出占用 I/O 最多的进程。
关键参数:
iotop -o # 只显示正在做 I/O 的进程
iotop -b -n 3 # 批处理模式,3 次采样
iotop -a # 累计 I/O
iotop -p <pid> # 指定进程
实战片段:
# 找出写盘最猛的进程
iotop -o -d 2 -n 5
# 监控 MySQL 进程
iotop -p $(pidof mysqld)
注意事项:
iotop
需要 iotop包-
输出按列排序:磁盘读、磁盘写、IO 总占比、命令 -
容器内需要 SYS_ADMIN 权限
8.3 smartctl:硬盘健康
目的:查硬盘 SMART 信息,预测硬盘故障。
关键参数:
smartctl -a /dev/sda # 全部信息
smartctl -H /dev/sda # 健康状态
smartctl -t long /dev/sda # 长自检
smartctl -l selftest /dev/sda # 自检日志
实战片段:
# 看硬盘健康
smartctl -H /dev/sda
# PASSED = 健康,FAILED = 故障
# 看硬盘温度
smartctl -a /dev/sda | grep -i temperature
# 看重映射扇区数(重要指标)
smartctl -a /dev/sda | grep -i reallocated
# 短自检
smartctl -t short /dev/sda
注意事项:
-
物理机才有 SMART,虚拟机看不到物理硬盘 Reallocated_Sector_Ct
增长是硬盘快坏的重要信号 -
自检会降低磁盘性能,生产环境慎用
九、文件系统类命令
9.1 df:磁盘空间
目的:看文件系统的空间使用。
关键参数:
df -h # 人类可读
df -hT # 带文件系统类型
df -i # inode 使用
df -h /path # 看指定路径所在分区
实战片段:
# 关键看 Use% 和 inode
df -h
df -i
# 找空间使用 > 80% 的分区
df -h | awk 'NR>1 && $5+0 > 80 {print}'
# 看指定目录所在分区
df -h /var/log
注意事项:
-
必须同时看空间和 inode,inode 满也会无法写文件 df -hT
能看到文件系统类型(ext4、xfs、tmpfs) -
bind mount 的目录会和原分区一起算
9.2 du:目录大小
目的:看目录或文件占用空间。
关键参数:
du -sh /path # 汇总
du -h --max-depth=1 /path # 子目录深度
du -ah /path | sort -h | tail # 找大文件
实战片段:
# 找根下最大的目录
du -sh /* 2>/dev/null | sort -h | tail -10
# 找 /var/log 下最大的文件
du -ah /var/log 2>/dev/null | sort -h | tail -20
# 找最近 1 天内变大超过 100M 的文件
find / -xdev -mtime -1 -size +100M -exec ls -lh {} \;
注意事项:
du
会扫描目录,大目录很慢 -
在 I/O 高的机器上用 ionice -c3 nice -n 19 du ...降低影响 du -h
显示单位人性化, du -sh只显示总和du -h --max-depth=1
看第一层
9.3 ls:文件列表
目的:看目录内容。
关键参数:
ls -lh # 人类可读
ls -lhS # 按大小排序
ls -lht # 按时间排序
ls -lR # 递归
ls -la # 包含隐藏文件
实战片段:
# 找目录下最大的 10 个文件
ls -lhS | head -10
# 找最近修改的 10 个文件
ls -lht | head -10
注意事项:
ls
在大目录上慢 -
文件很多时用 ls -U跳过排序 ls -d */
只看目录
9.4 mount:挂载点
目的:查看挂载点和挂载选项。
实战片段:
# 看所有挂载点
mount | column -t
# 看指定挂载选项
mount | grep -E ' / '
# 看是否只读
mount | grep 'ro,'
注意事项:
-
文件系统被改成只读( ro,relatime)通常是硬件问题 mount -o remount,ro /
可以临时改成只读
9.5 tune2fs / xfs_info:文件系统信息
目的:查文件系统参数。
实战片段:
# ext4 文件系统
tune2fs -l /dev/sda1
# xfs 文件系统
xfs_info /dev/sda1
xfs_info /mnt/data
注意事项:
-
ext4 用 tune2fs -
xfs 用 xfs_info -
生产环境改文件系统参数前必须先备份
十、网络类命令
10.1 ss:Socket 统计
目的:替代 netstat 的现代工具。
关键参数:
ss -lntp # 监听中的 TCP 端口
ss -anp # 所有连接
ss -s # 统计
ss -tan state established # 已建立的连接
ss -tan state time-wait # TIME_WAIT
ss -i # 详细信息
实战片段:
# 看监听端口
ss -lntp
# 看连接数
ss -s
ss -tan | awk '{print $1}' | sort | uniq -c | sort -rn
# 看进程名(需要 root)
ss -lntp | grep :80
# 看指定状态连接
ss -tan state time-wait | wc -l
ss -tan state close-wait | wc -l
注意事项:
ss
比 netstat快很多TIME_WAIT
大量堆积说明短连接多 CLOSE_WAIT
大量堆积说明对端没关闭连接,代码 bug -
看不到进程名时检查是否 root
10.2 netstat:网络统计(兼容)
目的:兼容老系统的网络工具。
关键参数:
netstat -lntp
netstat -anp
netstat -s
注意事项:
netstat
在新系统上可能未装(CentOS 8+ / Ubuntu 22+) -
优先用 ss
10.3 ip:网络配置
目的:替代 ifconfig 的现代工具。
关键参数:
ip a # 看所有 IP
ip route # 看路由
ip neigh # 看 ARP 表
ip link # 看网卡
ip -s link # 看网卡统计
实战片段:
# 看本机 IP
ip a | grep -E 'inet '
# 看路由
ip route
ip route get 8.8.8.8 # 看指定目标的路由
# 看 ARP
ip neigh
# 看网卡流量
ip -s link show eth0
注意事项:
ifconfig
在新系统可能未装 -
改 IP / 路由用 ip addr add/ip route add ip
命令是立即生效,不会持久化
10.4 mtr:网络诊断
目的:结合 ping 和 traceroute 的网络诊断工具。
关键参数:
mtr -rwn -c 20 <target> # 报告模式,20 次
mtr -rwn -c 100 <target> # 100 次,更准
实战片段:
mtr -rwn -c 20 8.8.8.8
mtr -rwn -c 20 example.com
注意事项:
mtr
比 traceroute信息更丰富,能看到丢包率和平均延迟Loss%
列:丢包率 Avg
:平均延迟 -
中间节点丢包不一定是该节点问题,下一跳丢包才说明 -
需要 root 或 CAP_NET_RAW 权限
10.5 traceroute:路由追踪
目的:显示包到目标经过的路由节点。
关键参数:
traceroute -n -w 2 -m 15 <target> # ICMP 模式
traceroute -T -n -w 2 -m 15 <target> # TCP 模式(穿透防火墙)
traceroute -I -n <target> # ICMP 模式
注意事项:
-
经典 UDP 模式容易被防火墙拦 traceroute -T
用 TCP SYN 包,更可靠 * * *
表示该节点不回包,可能禁了 ICMP
10.6 tcpdump:抓包
目的:抓网络包分析。
关键参数:
tcpdump -i eth0 # 抓 eth0
tcpdump -i eth0 -nn -A # 显示协议和内容
tcpdump -i eth0 -nn -s 0 port 80 # 抓 80 端口
tcpdump -i eth0 -nn host 1.2.3.4 # 指定主机
tcpdump -i eth0 -nn -w /tmp/cap.pcap # 写文件
tcpdump -r /tmp/cap.pcap # 读文件
实战片段:
# 看 80 端口的 HTTP 请求
tcpdump -i eth0 -nn -A -s 0 port 80
# 抓 MySQL 包
tcpdump -i eth0 -nn port 3306 -w /tmp/mysql.pcap
# 看 SYN 包
tcpdump -i eth0 -nn 'tcp[tcpflags] & tcp-syn != 0'
# 看 DNS
tcpdump -i eth0 -nn port 53
注意事项:
tcpdump
在高流量接口上可能丢包 -s 0
抓完整包(默认 68 字节只抓头) -
抓包文件用 Wireshark 打开更友好 -
抓包会消耗磁盘空间,控制 -c限制包数
10.7 dig:DNS 查询
目的:详细 DNS 查询。
关键参数:
dig example.com
dig +short example.com
dig +trace example.com # 完整解析过程
dig @8.8.8.8 example.com # 指定 DNS 服务器
dig -x 8.8.8.8 # 反向解析
实战片段:
# 看 DNS 解析
dig +short example.com
# 看解析过程(哪些 DNS 服务器参与)
dig +trace example.com
# 指定 DNS 服务器
dig @8.8.8.8 example.com
注意事项:
dig
比 nslookup输出更详细+trace
模拟迭代查询 ANSWER: 0
表示没解析到
10.8 nslookup:DNS 查询(兼容)
目的:DNS 查询的另一种工具。
实战片段:
nslookup example.com
nslookup -type=mx example.com
注意事项:
nslookup
已被某些发行版标记为废弃 -
优先用 dig或host
10.9 host:DNS 查询(简洁)
目的:简单的 DNS 查询。
实战片段:
host example.com
host -t mx example.com
十一、日志与包类命令
11.1 dmesg:内核日志
目的:看内核环形缓冲区的消息。
关键参数:
dmesg -T # 人类可读时间
dmesg -T -l err # 只看错误
dmesg -T -f kern # 只看内核消息
dmesg -C # 清空(危险)
实战片段:
# 看内核日志
dmesg -T | tail -100
# 看 OOM
dmesg -T | grep -i -E 'oom|killed'
# 看硬件错误
dmesg -T | grep -i -E 'mce|machine check|hardware error'
# 看挂载错误
dmesg -T | grep -i 'mount'
注意事项:
dmesg -C
会清空缓冲,禁止 -
内核日志在重启后会保留到 /var/log/kern.log或messages -
OOM、文件系统错误、硬件错误都会出现在 dmesg
11.2 journalctl:systemd 日志
目的:systemd 统一日志查询。
关键参数:
journalctl -u nginx.service # 服务日志
journalctl -u nginx --since "1 hour ago" # 最近 1 小时
journalctl -p err -b # 本次启动的错误
journalctl -f # 实时跟踪
journalctl _PID=<pid> # 指定进程
journalctl -k # 内核日志
journalctl --vacuum-time=7d # 清理 7 天前
实战片段:
# 看服务日志
journalctl -u nginx --since "1 hour ago" --no-pager
# 看本次启动的所有错误
journalctl -p err -b --no-pager
# 实时跟踪
journalctl -u mysql -f
# 看指定 PID 的日志
journalctl _PID=$(pidof mysqld) --no-pager
# 清理旧日志
journalctl --vacuum-time=7d
注意事项:
journalctl
默认在内存中,重启会丢(除非配置持久化) -
持久化配置: /var/log/journal/目录 --no-pager
防止分页(适合脚本) -
时间格式: "YYYY-MM-DD HH:MM:SS"
11.3 rpm / yum:CentOS/RHEL 包管理
关键命令:
rpm -qa # 所有已装包
rpm -qa --last | head # 按安装时间排序
rpm -V <package> # 验证包文件是否被改
rpm -qf /path/file # 文件属于哪个包
rpm -ql <package> # 包安装的所有文件
yum history # 安装历史
yum history info <id> # 某次安装详情
yum history undo <id> # 回滚
实战片段:
# 看最近 10 次安装
yum history | head
# 看某个文件的来源
rpm -qf /usr/bin/ls
# 看某个包安装的所有文件
rpm -ql nginx
# 看哪些包文件被改
rpm -Va | head
# 验证关键命令是否被替换
rpm -V coreutils
注意事项:
rpm -V
输出异常说明文件被修改,可能是入侵 yum history undo
可能回滚失败的依赖 rpm -V
没有输出表示包文件完整
11.4 dpkg / apt:Debian/Ubuntu 包管理
关键命令:
dpkg -l # 所有已装包
dpkg -L <package> # 包安装的所有文件
dpkg -S /path/file # 文件属于哪个包
dpkg -V # 验证包文件
debsums -c # 验证包文件
apt list --installed # 已装包
apt log # 安装日志
注意事项:
dpkg -V
可能提示缺失,常见于 logrotate 后的文件 debsums
需要单独安装
十二、文本处理三剑客
12.1 grep:文本搜索
关键参数:
grep -n # 显示行号
grep -i # 忽略大小写
grep -r # 递归
grep -E # 扩展正则
grep -v # 反向
grep -c # 计数
grep -l # 只显示文件名
grep -A 5 # 显示匹配后 5 行
grep -B 5 # 显示匹配前 5 行
grep -C 5 # 显示匹配前后 5 行
grep --color # 高亮
实战片段:
# 在日志中找错误
grep -nE 'error|exception' /var/log/messages
# 递归找包含某字符串的文件
grep -rn 'TODO' /opt/app/
# 排除注释行
grep -v '^#' /etc/nginx/nginx.conf
# 找指定时间范围的日志
grep '2026-07-03 14:2' /var/log/messages
注意事项:
grep -E
用扩展正则, grep -P用 Perl 正则-
大文件用 grep --mmap减少 I/O grep -F
按字面量搜索,跳过正则
12.2 awk:文本处理
关键参数:
awk '{print $1}' # 第一列
awk -F: '{print $1}' # 自定义分隔符
awk '$3 > 80' file # 条件
awk 'NR>1' file # 跳过第一行
awk '{sum+=$1} END {print sum}' # 求和
awk -v t=10 '$1 > t' file # 传参
实战片段:
# 统计 access log 各 IP 访问次数
awk '{print $1}' /var/log/nginx/access.log | sort | uniq -c | sort -rn | head
# 看系统连接的各个状态数量
ss -tan | awk 'NR>1 {print $1}' | sort | uniq -c | sort -rn
# 求某列总和
ps -eo pcpu | awk '{sum+=$1} END {print sum}'
# 格式化输出
df -h | awk 'NR>1 {printf "%-20s %s\n", $6, $5}'
注意事项:
awk
的 $0是整行,$1$2是字段NR
是行号, NF是字段数awk
内部正则强大,能替代很多 grep + sed 组合
12.3 sed:流编辑器
关键参数:
sed 's/old/new/' file # 替换每行第一个
sed 's/old/new/g' file # 替换所有
sed -i.bak 's/old/new/g' file # 原地编辑并备份
sed -n '5,10p' file # 显示 5-10 行
sed '/^#/d' file # 删除注释行
sed '/pattern/d' file # 删除匹配行
sed -i '/pattern/d' file # 原地删除
实战片段:
# 替换配置文件中的参数
sed -i.bak 's/^port=.*/port=8080/' /etc/myapp/config.ini
# 删注释行
sed '/^#/d; /^$/d' /etc/nginx/nginx.conf
# 提取指定行范围
sed -n '10,30p' /var/log/messages
# 多重替换
sed -e 's/foo/bar/g' -e 's/baz/qux/g' file
注意事项:
sed -i
一定要先备份或加 .bak后缀-
路径含 /时分隔符改#或| sed -n 'Np'
打印第 N 行
12.4 xargs:参数构造器
关键参数:
xargs -I {} cmd {} # 占位符
xargs -n 1 cmd # 每次 1 个参数
xargs -P 4 cmd # 4 个并发
xargs -d '\n' cmd # 自定义分隔符
实战片段:
# 杀所有匹配进程
ps -ef | grep 'java' | grep -v grep | awk '{print $2}' | xargs kill
# 批量改文件权限
find /var/log -name '*.log' | xargs chmod 644
# 并行压缩
find . -name '*.log' | xargs -P 4 gzip
# 处理文件名含空格的
find . -name '*.txt' -print0 | xargs -0 rm
注意事项:
- 没有
-I时 xargs 默认按空格分词
,文件名含空格会出问题 -
用 find -print0+xargs -0处理文件名含特殊字符 xargs -I {}
显式占位符更安全
十三、find:文件查找
find 关键参数
find /path -name '*.log' # 按名
find /path -type f # 文件
find /path -type d # 目录
find /path -size +100M # 大于 100M
find /path -mtime -7 # 7 天内修改
find /path -mtime +30 # 30 天前修改
find /path -user www-data # 按用户
find /path -perm 777 # 按权限
find /path -name '*.log' -delete # 删除(危险)
实战片段:
# 找 /var/log 下 30 天前的文件
find /var/log -name '*.log' -mtime +30
# 找大文件
find / -xdev -size +1G -type f 2>/dev/null
# 干跑删除(先看会删什么)
find /var/log -name '*.log' -mtime +30 -print
# 真的删除(确认后再执行)
find /var/log -name '*.log' -mtime +30 -delete
注意事项:
find -delete
一定要先 find -print看一遍-xdev
不跨文件系统,避免扫描 /proc/sys-
大目录用 -maxdepth限制深度 - 不要
对根目录执行 find -delete
十四、服务管理类命令
14.1 systemctl:服务管理
关键参数:
systemctl status <service>
systemctl start <service>
systemctl stop <service>
systemctl restart <service>
systemctl reload <service>
systemctl enable <service>
systemctl disable <service>
systemctl list-units --type=service
systemctl list-units --state=failed
systemctl cat <service>
systemctl show <service>
实战片段:
# 看服务状态
systemctl status nginx
# 看服务启动失败原因
systemctl status nginx -l --no-pager
journalctl -u nginx --no-pager
# 看服务配置
systemctl cat nginx
# 看运行时配置
systemctl show nginx | grep -E 'MemoryMax|CPUQuota'
# 重启并查看日志
systemctl restart nginx
journalctl -u nginx -f
注意事项:
systemctl reload
不中断服务(如果支持) systemctl restart
会短暂中断 -
状态 inactive (dead)不一定是问题,可能服务不自动启动 -
状态 active (running)但端口没监听 = 假活
14.2 journalctl:服务日志
见 11.2 节。
14.3 service:兼容旧 SysV
实战片段:
service nginx status
service nginx restart
注意事项:
service
命令会调用 systemctl -
仅用于兼容性,新脚本用 systemctl
十五、文件与权限类命令
15.1 stat:文件元信息
实战片段:
stat /etc/passwd
# File: /etc/passwd
# Size: 2841 Blocks: 8 IO Block: 1024 regular file
# Access: (0644/-rw-r--r--) Uid: ( 0/ root) Gid: ( 0/ root)
# Access: 2026-07-03 10:23:11.000000000 +0800
# Modify: 2026-06-30 14:23:11.000000000 +0800
# Change: 2026-06-30 14:23:11.000000000 +0800
注意事项:
Access
时间在 2.6+ 内核可能被记录不准 Modify
是内容修改时间 Change
是元数据修改时间
15.2 getfacl / setfacl:ACL 权限
实战片段:
# 看 ACL
getfacl /var/www/html
# 给 nginx 用户加读权限
setfacl -m u:nginx:r-x /var/www/html
# 移除 ACL
setfacl -x u:nginx /var/www/html
注意事项:
-
文件系统挂载时启用 ACL: mount -o acl /dev/sda1 /mnt -
ACL 比传统 ugo 权限更灵活 -
备份时要带 getfacl -R保存 ACL
15.3 chattr / lsattr:文件属性
实战片段:
# 设为不可修改(重要文件用)
chattr +i /etc/passwd
lsattr /etc/passwd
# 设为只追加(日志用)
chattr +a /var/log/messages
注意事项:
chattr +i
防止文件被改、被删,但 root 也能解 chattr +a
文件只能追加,不能修改 -
误用 chattr +i会让配置改不动,紧急时用chattr -i
十六、资源限制类命令
16.1 ulimit:进程资源限制
关键参数:
ulimit -a # 所有限制
ulimit -n # 文件描述符
ulimit -u # 进程数
ulimit -s # 栈大小
ulimit -t # CPU 时间
ulimit -v # 虚拟内存
实战片段:
# 看所有限制
ulimit -a
# 临时修改(仅当前 shell)
ulimit -n 65535
# 永久修改
echo "ulimit -n 65535" >> /etc/profile
注意事项:
ulimit
在登录 shell 里设置才生效 -
systemd 服务的限制在 unit 文件里 LimitNOFILE=
16.2 /etc/security/limits.conf
实战片段:
cat /etc/security/limits.conf
配置格式:
#<domain> <type> <item> <value>
* soft nofile 65535
* hard nofile 65535
root soft nofile 65535
root hard nofile 65535
注意事项:
-
修改后需要重新登录才生效 -
systemd 服务不读这个文件,要在 unit 里设置 *
表示所有用户,但 root 可能需要单独设置
十七、配置示例汇总
17.1 进程信息收集脚本
#!/usr/bin/env bash
# /usr/local/bin/proc-info.sh
PID=${1:?"usage: $0 <pid>"}
echo"=== Process Info for PID $PID ==="
ps -p $PID -o pid,ppid,user,stat,etime,pcpu,pmem,comm,args
echo
echo"=== Status ==="
cat /proc/$PID/status 2>/dev/null
echo
echo"=== Wchan ==="
cat /proc/$PID/wchan
echo
echo"=== Open files (top 20) ==="
ls -la /proc/$PID/fd 2>/dev/null | head -20
echo
echo"=== Open network connections ==="
ls -la /proc/$PID/fd 2>/dev/null | grep socket | wc -l
echo sockets
17.2 系统健康检查脚本
#!/usr/bin/env bash
# /usr/local/bin/health-check.sh
echo"=== Uptime ==="
uptime
echo
echo"=== CPU ==="
mpstat -P ALL 2 2 | tail -n $(($(nproc)+1))
echo
echo"=== Memory ==="
free -h
echo
echo"=== Disk ==="
df -h
echo
echo"=== Inode ==="
df -i
echo
echo"=== I/O ==="
iostat -xz 2 2 | tail -n +4
echo
echo"=== Connections ==="
ss -s
echo
echo"=== Failed services ==="
systemctl --failed --no-pager
十八、风险提醒
rm -rf
任何目录前先 ls确认find -delete
一定要先 find -print看kill -9
数据库进程会导致数据损坏 iptables -F
容易失联 chmod 777
是危险的万能钥匙 chattr +i
后文件改不动 dd if=/dev/zero of=/dev/sda
会清空磁盘 -
配置文件改之前先备份 -
Shell 脚本路径加引号 -
远程操作前确认网络稳定
十九、验证方式
-
跑一遍 health-check.sh看输出 -
用 wrk压测对比 -
看监控基线是否正常 -
用 strace -c跟踪进程的系统调用分布 -
写运维剧本让新人执行一遍
二十、回滚方案
-
配置改之前先 cp备份 -
服务改之前先 systemctl show看状态 -
关键操作前先 iptables-save备份规则 -
配置文件入 Git,方便回滚 -
数据库 schema 改之前先备份 -
升级包之前先 yum history记下 ID
二十一、生产环境注意事项
-
任何破坏性操作必须三思 -
重要操作必须有第二个人知道 -
业务高峰期不做高风险操作 -
改配置文件先在测试环境试 -
监控先行:先看基线,再变更 -
重要变更走变更工单 -
数据库 / etcd 重要数据定期备份 -
命令风险等级标注在 Runbook 里 -
容器内命令要确认 namespace -
敏感信息(密码、Token)通过环境变量或密钥管理,不要写进脚本
二十二、总结
把命令练成肌肉记忆是运维工程师的基本功。50+ 个常用命令覆盖了 CPU、内存、磁盘 I/O、网络、进程、日志、服务管理、文本处理、资源限制等所有常见排障场景。
最后给初中级运维工程师的几点建议:
- 每个命令都亲手敲一遍
:看会不等于会 - 建立”现象 → 命令”的反射弧
:先看现象,再想命令 - 做笔记
:把所有命令的实战场景记下来 - 整理 Runbook
:把命令按场景组织成可执行文档 - 风险意识
:每个命令前先判断风险等级 - 持续学习
:新工具(bpftrace、systemd-cgtop)持续关注 - 配合监控
:命令 + 监控才能快速定位 - 复盘总结
:每次故障后整理使用的命令
把这 50+ 个命令练成肌肉记忆,配合上监控告警和 Runbook,你就能在 5 分钟内从”业务慢了”走到”根因已定”,剩下就是按操作手册执行。
转自:马哥Linux运维
版权申明:内容来源网络,版权归原创者所有,如有侵权请联系删除
想了解更多干货,可通过下方扫码关注

可扫码添加上智启元官方客服微信👇

17认证网








