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 风格,部分参数不同)
- 容器内部署的命令(容器内命令和宿主机基本一致,但资源限制、namespace 视角不同)
- 大型分布式系统(Hadoop、Ceph、Kafka 集群)的运维命令
三、核心知识点
3.1 Linux 命令的"反射弧"
运维工程师要建立的第一类反射弧是"现象 → 命令"。下面是一些典型映射:
| |
|---|
| uptime |
| free -h |
| iostat -xz 2 |
| ss -lntp |
| systemctl status |
| df -h |
| 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
输出解读:
USERPID%CPU%MEMSTAT:进程状态(R 运行、S 中断、D 不可中断睡眠、Z 僵尸、T 停止、I 空闲)STARTTIMECOMMAND
实战片段:
# 找占用 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 auxSTAT 列中的 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> # 显示进程的线程
常用交互:
实战片段:
# 找出 CPU 最高的进程(结合 ps 用)top -b -n1 -o %CPU | head -20# 看 Java 进程的线程top -H -p <pid># 看指定用户的进程top -u www-data
注意事项:
toptop -b -n1 比 ps 慢,但能看到每个进程的实时 CPU 占用- 推荐用
htop 替代默认 top,更直观,支持鼠标
5.3 htop:top 的增强版
目的:比 top 更友好的交互式监控。
安装:
yum install -y htopapt install -y htop
实战片段:
htop -d 5 # 5 秒刷新一次htop -u www-data # 只显示指定用户htop -p <pid> # 只显示指定进程htop -t # 树形视图
注意事项:
5.4 pidstat:进程级资源统计
目的:按时间间隔采样进程 CPU、内存、I/O 数据。
关键参数:
pidstat -p <pid> 2 5 # 每 2 秒采样 1 次,共 5 次pidstat -u 2 5 # 所有进程 CPUpidstat -r 2 5 # 内存pidstat -d 2 5 # I/Opidstat -w 2 5 # 上下文切换
实战片段:
# 监控 Java 进程的 CPUpidstat -p <pid> 2 5 -u# 监控 MySQL 进程的 I/Opidstat -p $(pidof mysqld) 2 5 -d# 看上下文切换最高的进程pidstat -w 2 5 | head -20
注意事项:
- pidstat 在 CentOS 7+ / Ubuntu 16+ 默认在
sysstat 包里
5.5 pstree:进程树
目的:以树形结构显示进程父子关系。
关键参数:
pstree -a # 显示命令行pstree -p # 显示 PIDpstree -u # 显示用户切换pstree -s <pid> # 显示指定进程的父链
实战片段:
pstree -ap | headpstree -p <pid> | head
注意事项:
- 找不到父进程时显示
init 或 systemd(PID 1)
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- 跟踪的进程如果是 root 运行,strace 必须也是 root
-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
注意事项:
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>/wchanecho# 看进程的状态cat /proc/<pid>/status# 看进程的内存映射cat /proc/<pid>/maps | head# 看进程的资源限制cat /proc/<pid>/limits
注意事项:
/proc/PID/fd/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 availableMem: 64217 12832 1024 2048 50361 48876Swap: 4095 128 3967
totalusedfreesharedbuff/cacheavailable:真正可用的内存(free + 可回收 buff/cache)
实战片段:
# 关键看 available,不是 freefree -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/meminfoDirtyAnonPages
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
注意事项:
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 满)bswpdfreesi / sobi / boincsus / 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% 说明宿主机忙
注意事项:
6.5 slabtop:内核 slab 缓存
目的:查看内核 slab 分配器的内存使用。
实战片段:
# 实时查看slabtop -d 2# 看 dentry(目录项)缓存slabtop | head -20# 看某个 slab 的细节cat /proc/slabinfo | head -20
注意事项:
七、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 分钟的运行队列平均长度- 如果 1 分钟负载远高于 5 分钟和 15 分钟,故障刚发生
注意事项:
- 负载高不一定是 CPU 满,也可能是 I/O 阻塞(看
iowait) - 经验值:load < CPU 核数 算健康,> 2× 核数算严重
nproc
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%usr%sys%iowait%steal%soft
7.3 sar:系统活动报告
目的:长期采样并记录系统活动,可以回看历史。
关键参数:
sar -u 2 5 # CPUsar -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 后定期采集sarsar -f
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 30perf report# 看 CPU 上下文切换perf stat -e context-switches,cs,migrations -p <pid> sleep 5
注意事项:
perfperf 用 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 %utilsda 1.20 5.50 50.0 200.0 2.5 0.5 0.5
r/srkB/sawait:平均每次 I/O 等待毫秒数(队列 + 服务时间)svctm%util
实战片段:
# 找 I/O 瓶颈磁盘iostat -xz 2 5# 关键看:# %util > 60% 算繁忙# await > 10ms(机械盘)算有问题# await > 1ms(SSD)算有问题
注意事项:
%utilawait 飙升但 %util 不高,可能是 RAID 卡或 SAN 问题iostat%util
8.2 iotop:进程级 I/O 监控
目的:找出占用 I/O 最多的进程。
关键参数:
iotop -o # 只显示正在做 I/O 的进程iotop -b -n 3 # 批处理模式,3 次采样iotop -a # 累计 I/Oiotop -p <pid> # 指定进程
实战片段:
# 找出写盘最猛的进程iotop -o -d 2 -n 5# 监控 MySQL 进程iotop -p $(pidof mysqld)
注意事项:
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
注意事项:
九、文件系统类命令
9.1 df:磁盘空间
目的:看文件系统的空间使用。
关键参数:
df -h # 人类可读df -hT # 带文件系统类型df -i # inode 使用df -h /path # 看指定路径所在分区
实战片段:
# 关键看 Use% 和 inodedf -hdf -i# 找空间使用 > 80% 的分区df -h | awk 'NR>1 && $5+0 > 80 {print}'# 看指定目录所在分区df -h /var/log
注意事项:
- 必须同时看空间和 inode,inode 满也会无法写文件
df -hT 能看到文件系统类型(ext4、xfs、tmpfs)
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 -execls -lh {} \;
注意事项:
du- 在 I/O 高的机器上用
ionice -c3 nice -n 19 du ... 降低影响 du -hdu -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
注意事项:
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/sda1xfs_info /mnt/data
注意事项:
十、网络类命令
10.1 ss:Socket 统计
目的:替代 netstat 的现代工具。
关键参数:
ss -lntp # 监听中的 TCP 端口ss -anp # 所有连接ss -s # 统计ss -tan state established # 已建立的连接ss -tan state time-wait # TIME_WAITss -i # 详细信息
实战片段:
# 看监听端口ss -lntp# 看连接数ss -sss -tan | awk '{print $1}' | sort | uniq -c | sort -rn# 看进程名(需要 root)ss -lntp | grep :80# 看指定状态连接ss -tan state time-wait | wc -lss -tan state close-wait | wc -l
注意事项:
10.2 netstat:网络统计(兼容)
目的:兼容老系统的网络工具。
关键参数:
netstat -lntpnetstat -anpnetstat -s
注意事项:
netstat 在新系统上可能未装(CentOS 8+ / Ubuntu 22+)
10.3 ip:网络配置
目的:替代 ifconfig 的现代工具。
关键参数:
ip a # 看所有 IPip route # 看路由ip neigh # 看 ARP 表ip link# 看网卡ip -s link# 看网卡统计
实战片段:
# 看本机 IPip a | grep -E 'inet '# 看路由ip routeip route get 8.8.8.8 # 看指定目标的路由# 看 ARPip 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.8mtr -rwn -c 20 example.com
注意事项:
mtr 比 traceroute 信息更丰富,能看到丢包率和平均延迟Loss%Avg
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 模式
注意事项:
10.6 tcpdump:抓包
目的:抓网络包分析。
关键参数:
tcpdump -i eth0 # 抓 eth0tcpdump -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'# 看 DNStcpdump -i eth0 -nn port 53
注意事项:
10.7 dig:DNS 查询
目的:详细 DNS 查询。
关键参数:
dig example.comdig +short example.comdig +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
注意事项:
10.8 nslookup:DNS 查询(兼容)
目的:DNS 查询的另一种工具。
实战片段:
nslookup example.comnslookup -type=mx example.com
注意事项:
10.9 host:DNS 查询(简洁)
目的:简单的 DNS 查询。
实战片段:
host example.comhost -t mx example.com
十一、日志与包类命令
11.1 dmesg:内核日志
目的:看内核环形缓冲区的消息。
关键参数:
dmesg -T # 人类可读时间dmesg -T -l err # 只看错误dmesg -T -f kern # 只看内核消息dmesg -C # 清空(危险)
实战片段:
# 看内核日志dmesg -T | tail -100# 看 OOMdmesg -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 -Vyum history undorpm -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
注意事项:
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}'
注意事项:
awkNRawk 内部正则强大,能替代很多 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
注意事项:
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 # 大于 100Mfind /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
注意事项:
十四、服务管理类命令
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=servicesystemctl list-units --state=failedsystemctl cat <service>systemctl show <service>
实战片段:
# 看服务状态systemctl status nginx# 看服务启动失败原因systemctl status nginx -l --no-pagerjournalctl -u nginx --no-pager# 看服务配置systemctl cat nginx# 看运行时配置systemctl show nginx | grep -E 'MemoryMax|CPUQuota'# 重启并查看日志systemctl restart nginxjournalctl -u nginx -f
注意事项:
systemctl reloadsystemctl restart- 状态
inactive (dead) 不一定是问题,可能服务不自动启动 - 状态
active (running) 但端口没监听 = 假活
14.2 journalctl:服务日志
见 11.2 节。
14.3 service:兼容旧 SysV
实战片段:
service nginx statusservice nginx restart
注意事项:
十五、文件与权限类命令
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
注意事项:
15.2 getfacl / setfacl:ACL 权限
实战片段:
# 看 ACLgetfacl /var/www/html# 给 nginx 用户加读权限setfacl -m u:nginx:r-x /var/www/html# 移除 ACLsetfacl -x u:nginx /var/www/html
注意事项:
- 文件系统挂载时启用 ACL:
mount -o acl /dev/sda1 /mnt
15.3 chattr / lsattr:文件属性
实战片段:
# 设为不可修改(重要文件用)chattr +i /etc/passwdlsattr /etc/passwd# 设为只追加(日志用)chattr +a /var/log/messages
注意事项:
chattr +ichattr +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- systemd 服务的限制在 unit 文件里
LimitNOFILE=
16.2 /etc/security/limits.conf
实战片段:
cat /etc/security/limits.conf
配置格式:
#<domain> <type> <item> <value>* soft nofile 65535* hard nofile 65535root soft nofile 65535root hard nofile 65535
注意事项:
- systemd 服务不读这个文件,要在 unit 里设置
*
十七、配置示例汇总
17.1 进程信息收集脚本
#!/usr/bin/env bash# /usr/local/bin/proc-info.shPID=${1:?"usage: $0 <pid>"}echo"=== Process Info for PID $PID ==="ps -p $PID -o pid,ppid,user,stat,etime,pcpu,pmem,comm,argsechoecho"=== Status ==="cat /proc/$PID/status 2>/dev/nullechoecho"=== Wchan ==="cat /proc/$PID/wchanechoecho"=== Open files (top 20) ==="ls -la /proc/$PID/fd 2>/dev/null | head -20echoecho"=== Open network connections ==="ls -la /proc/$PID/fd 2>/dev/null | grep socket | wc -lecho sockets
17.2 系统健康检查脚本
#!/usr/bin/env bash# /usr/local/bin/health-check.shecho"=== Uptime ==="uptimeechoecho"=== CPU ==="mpstat -P ALL 2 2 | tail -n $(($(nproc)+1))echoecho"=== Memory ==="free -hechoecho"=== Disk ==="df -hechoecho"=== Inode ==="df -iechoecho"=== I/O ==="iostat -xz 2 2 | tail -n +4echoecho"=== Connections ==="ss -sechoecho"=== Failed services ==="systemctl --failed --no-pager
十八、风险提醒
rm -rffind -deletekill -9iptables -Fchmod 777chattr +idd if=/dev/zero of=/dev/sda
十九、验证方式
二十、回滚方案
- 服务改之前先
systemctl show 看状态 - 关键操作前先
iptables-save 备份规则
二十一、生产环境注意事项
- 敏感信息(密码、Token)通过环境变量或密钥管理,不要写进脚本
二十二、总结
把命令练成肌肉记忆是运维工程师的基本功。50+ 个常用命令覆盖了 CPU、内存、磁盘 I/O、网络、进程、日志、服务管理、文本处理、资源限制等所有常见排障场景。
最后给初中级运维工程师的几点建议:
- 每个命令都亲手敲一遍
- 建立"现象 → 命令"的反射弧
- 做笔记
- 整理 Runbook
- 风险意识
- 持续学习:新工具(bpftrace、systemd-cgtop)持续关注
- 配合监控
- 复盘总结
把这 50+ 个命令练成肌肉记忆,配合上监控告警和 Runbook,你就能在 5 分钟内从"业务慢了"走到"根因已定",剩下就是按操作手册执行。