Linux 运维必会:这些命令不会,排障效率至少慢一半17认证网

正规官方授权
更专业・更权威

Linux 运维必会:这些命令不会,排障效率至少慢一半

Linux 运维必会:这些命令不会,排障效率至少慢一半

一、问题背景

我带过不少初中级运维工程师,发现一个普遍现象:很多新人面对故障时只会 topdf -hfree -m 三件套,看到不熟悉的输出就抓瞎。等他们查清楚问题,故障已经过了一个小时。

运维工程师的核心竞争力不是”会多少命令”,而是”看到现象后能在 5 秒内想到用什么命令”。这种反射弧来自大量的命令积累和实战练习。

我做了 8 年运维,从最开始的只会 lscdcat,到后来能 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

 / `dmesg
磁盘 I/O 高
iostat -xz 2

 / iotop
网络连不上
ss -lntp

 / mtr / tcpdump
进程消失
systemctl status

 / journalctl -u
磁盘写满
df -h

 / du -sh /*
inode 满
df -i
系统日志
journalctl -p err
系统调用
strace -p PID
进程打开了什么文件
lsof -p PID

3.2 命令的”风险等级”

运维命令按风险分四类:

  • 安全级
    (read-only):uptimefreedfss -sps
  • 观察级
    (可能影响性能):stracetcpdumpperf top
  • 修改级
    (明确改变状态):systemctl restartkilliptables -I
  • 破坏级
    (高风险):rm -rfddmkfsfdisk

任何命令执行前都要先判断它属于哪一级。破坏级命令必须有备份、有审批、有回滚。

3.3 重点目录速查

路径
用途
/proc/PID/
进程运行时信息(内存、文件、状态)
/proc/sys/
内核运行时参数
/proc/loadavg
系统负载
/proc/meminfo
内存详情
/sys/fs/cgroup/
cgroup 资源限制
/var/log/
系统日志
/etc/systemd/system/
systemd 单元配置
/sys/class/net/
网卡运行时信息

熟悉这些目录能让你在系统启动不起来、工具命令都不可用时依然能排查。

四、整体命令使用思路

我习惯把命令按”目的”组织成 5 类:

  1. 状态查询类
    :查看系统或进程当前状态
  2. 问题定位类
    :根据状态进一步追踪根因
  3. 变更执行类
    :修改配置或重启服务
  4. 批量处理类
    :处理多个文件或进程
  5. 信息提取类
    :从日志或输出中提取关键信息

每类命令的选择逻辑在下面章节展开。

五、进程类命令

5.1 ps:进程快照

目的:列出系统所有进程的状态。

关键参数

   bash
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
    :启动命令

实战片段

   bash
# 找占用 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:实时进程监控

目的:动态查看系统状态和进程信息。

关键参数

   bash
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
    :退出

实战片段

   bash
# 找出 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 更友好的交互式监控。

安装

   bash
yum install -y htop
apt install -y htop

实战片段

   bash
htop -d 5        # 5 秒刷新一次
htop -u www-data # 只显示指定用户
htop -p <pid>    # 只显示指定进程
htop -t          # 树形视图

注意事项

  • htop 鼠标可点击,比 top 友好
  • 颜色标记:D 状态标红色,R 状态标绿色
  • 鼠标拖动显示树形关系

5.4 pidstat:进程级资源统计

目的:按时间间隔采样进程 CPU、内存、I/O 数据。

关键参数

   bash
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               # 上下文切换

实战片段

   bash
# 监控 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:进程树

目的:以树形结构显示进程父子关系。

关键参数

   bash
pstree -a           # 显示命令行
pstree -p           # 显示 PID
pstree -u           # 显示用户切换
pstree -s <pid>     # 显示指定进程的父链

实战片段

   bash
pstree -ap | head
pstree -p <pid> | head

注意事项

  • 找不到父进程时显示 init 或 systemd(PID 1)
  • 进程很多时输出会很长,建议用 less 查看

5.6 strace:追踪系统调用

目的:跟踪进程的系统调用和信号。

关键参数

   bash
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>  # 启动并跟踪命令

实战片段

   bash
# 看 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、管道等。

关键参数

   bash
lsof -p <pid>             # 进程打开的所有文件
lsof -i :80               # 占用 80 端口的进程
lsof /var/log/messages    # 谁在写这个文件
lsof -u <user>            # 指定用户打开的文件
lsof +D /var/log          # 目录下所有被打开的文件(递归)
lsof -i -P -n             # 显示 TCP/UDP 连接

实战片段

   bash
# 看 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/*:进程运行时信息

目的:直接通过文件系统查看进程信息。

关键路径

   bash
/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          # 资源限制

实战片段

   bash
# 看进程的命令行(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:内存使用情况

目的:快速查看内存总量、已用、空闲、可用、缓存。

关键参数

   bash
free -h        # 人类可读
free -m        # MB 单位
free -g        # GB 单位
free -s 2      # 每 2 秒刷新
free -c 5      # 刷新 5 次

输出解读

   text
              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)

实战片段

   bash
# 关键看 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:内存详情

目的:看更详细的内存信息。

实战片段

   bash
# 看关键指标
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:进程内存映射

目的:查看进程占用的内存分布。

关键参数

   bash
pmap -x <pid>       # 详细模式
pmap -d <pid>       # 设备格式
pmap <pid> | sort -k2 -n -r | head  # 按 RSS 排序

实战片段

   bash
# 看 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、上下文切换。

关键参数

   bash
vmstat 2 5          # 每 2 秒采样,共 5 次
vmstat -s           # 一次性输出统计
vmstat -d           # 磁盘统计

输出解读

   text
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

实战片段

   bash
# 看 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 分配器的内存使用。

实战片段

   bash
# 实时查看
slabtop -d 2

# 看 dentry(目录项)缓存
slabtop | head -20

# 看某个 slab 的细节
cat /proc/slabinfo | head -20

注意事项

  • 内核 slab 缓存持续增长可能是内核内存泄漏
  • dentry
     缓存太多说明打开过很多文件
  • slabtop
     默认安装,需要 procps 包

七、CPU 类命令

7.1 uptime:系统负载

目的:快速看系统运行时间和 1/5/15 分钟负载。

实战片段

   bash
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 核心的使用情况。

关键参数

   bash
mpstat -P ALL 2 5    # 所有核,每 2 秒采样 5 次
mpstat -I ALL 2 5    # 中断统计
mpstat -I CPU 2 5    # 中断按 CPU 聚合

实战片段

   bash
# 看每核的 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:系统活动报告

目的:长期采样并记录系统活动,可以回看历史。

关键参数

   bash
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           # 队列长度

实战片段

   bash
# 看 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 性能分析

目的:内核和应用的性能采样和追踪。

关键参数

   bash
perf top                       # 实时热点
perf top -p <pid>              # 指定进程
perf record -p <pid> -g        # 采样 30 秒
perf report                    # 报告
perf stat -p <pid> sleep 5     # 5 秒内的硬件事件统计

实战片段

   bash
# 看系统热点
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 统计

目的:看每块磁盘的读写速率、利用率、等待时间。

关键参数

   bash
iostat -xz 2 5         # 扩展模式,每 2 秒采样 5 次
iostat -m 2 5          # MB 单位
iostat -d sda 2 5      # 只看 sda 磁盘
iostat -p ALL 2 5      # 显示分区

输出解读

   text
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
    :设备利用率(饱和度)

实战片段

   bash
# 找 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 最多的进程。

关键参数

   bash
iotop -o        # 只显示正在做 I/O 的进程
iotop -b -n 3   # 批处理模式,3 次采样
iotop -a         # 累计 I/O
iotop -p <pid>   # 指定进程

实战片段

   bash
# 找出写盘最猛的进程
iotop -o -d 2 -n 5

# 监控 MySQL 进程
iotop -p $(pidof mysqld)

注意事项

  • iotop
     需要 iotop 包
  • 输出按列排序:磁盘读、磁盘写、IO 总占比、命令
  • 容器内需要 SYS_ADMIN 权限

8.3 smartctl:硬盘健康

目的:查硬盘 SMART 信息,预测硬盘故障。

关键参数

   bash
smartctl -a /dev/sda           # 全部信息
smartctl -H /dev/sda           # 健康状态
smartctl -t long /dev/sda      # 长自检
smartctl -l selftest /dev/sda  # 自检日志

实战片段

   bash
# 看硬盘健康
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:磁盘空间

目的:看文件系统的空间使用。

关键参数

   bash
df -h        # 人类可读
df -hT       # 带文件系统类型
df -i        # inode 使用
df -h /path  # 看指定路径所在分区

实战片段

   bash
# 关键看 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:目录大小

目的:看目录或文件占用空间。

关键参数

   bash
du -sh /path     # 汇总
du -h --max-depth=1 /path  # 子目录深度
du -ah /path | sort -h | tail  # 找大文件

实战片段

   bash
# 找根下最大的目录
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:文件列表

目的:看目录内容。

关键参数

   bash
ls -lh      # 人类可读
ls -lhS     # 按大小排序
ls -lht     # 按时间排序
ls -lR      # 递归
ls -la      # 包含隐藏文件

实战片段

   bash
# 找目录下最大的 10 个文件
ls -lhS | head -10

# 找最近修改的 10 个文件
ls -lht | head -10

注意事项

  • ls
     在大目录上慢
  • 文件很多时用 ls -U 跳过排序
  • ls -d */
     只看目录

9.4 mount:挂载点

目的:查看挂载点和挂载选项。

实战片段

   bash
# 看所有挂载点
mount | column -t

# 看指定挂载选项
mount | grep -E ' / '

# 看是否只读
mount | grep 'ro,'

注意事项

  • 文件系统被改成只读(ro,relatime)通常是硬件问题
  • mount -o remount,ro /
     可以临时改成只读

9.5 tune2fs / xfs_info:文件系统信息

目的:查文件系统参数。

实战片段

   bash
# ext4 文件系统
tune2fs -l /dev/sda1

# xfs 文件系统
xfs_info /dev/sda1
xfs_info /mnt/data

注意事项

  • ext4 用 tune2fs
  • xfs 用 xfs_info
  • 生产环境改文件系统参数前必须先备份

十、网络类命令

10.1 ss:Socket 统计

目的:替代 netstat 的现代工具。

关键参数

   bash
ss -lntp     # 监听中的 TCP 端口
ss -anp      # 所有连接
ss -s        # 统计
ss -tan state established  # 已建立的连接
ss -tan state time-wait   # TIME_WAIT
ss -i         # 详细信息

实战片段

   bash
# 看监听端口
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:网络统计(兼容)

目的:兼容老系统的网络工具。

关键参数

   bash
netstat -lntp
netstat -anp
netstat -s

注意事项

  • netstat
     在新系统上可能未装(CentOS 8+ / Ubuntu 22+)
  • 优先用 ss

10.3 ip:网络配置

目的:替代 ifconfig 的现代工具。

关键参数

   bash
ip a        # 看所有 IP
ip route    # 看路由
ip neigh    # 看 ARP 表
ip link     # 看网卡
ip -s link  # 看网卡统计

实战片段

   bash
# 看本机 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 的网络诊断工具。

关键参数

   bash
mtr -rwn -c 20 <target>    # 报告模式,20 次
mtr -rwn -c 100 <target>   # 100 次,更准

实战片段

   bash
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:路由追踪

目的:显示包到目标经过的路由节点。

关键参数

   bash
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:抓包

目的:抓网络包分析。

关键参数

   bash
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              # 读文件

实战片段

   bash
# 看 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 查询。

关键参数

   bash
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            # 反向解析

实战片段

   bash
# 看 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 查询的另一种工具。

实战片段

   bash
nslookup example.com
nslookup -type=mx example.com

注意事项

  • nslookup
     已被某些发行版标记为废弃
  • 优先用 dig 或 host

10.9 host:DNS 查询(简洁)

目的:简单的 DNS 查询。

实战片段

   bash
host example.com
host -t mx example.com

十一、日志与包类命令

11.1 dmesg:内核日志

目的:看内核环形缓冲区的消息。

关键参数

   bash
dmesg -T          # 人类可读时间
dmesg -T -l err   # 只看错误
dmesg -T -f kern  # 只看内核消息
dmesg -C          # 清空(危险)

实战片段

   bash
# 看内核日志
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 统一日志查询。

关键参数

   bash
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 天前

实战片段

   bash
# 看服务日志
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 包管理

关键命令

   bash
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>       # 回滚

实战片段

   bash
# 看最近 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 包管理

关键命令

   bash
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:文本搜索

关键参数

   bash
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     # 高亮

实战片段

   bash
# 在日志中找错误
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:文本处理

关键参数

   bash
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       # 传参

实战片段

   bash
# 统计 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:流编辑器

关键参数

   bash
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       # 原地删除

实战片段

   bash
# 替换配置文件中的参数
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:参数构造器

关键参数

   bash
xargs -I {} cmd {}              # 占位符
xargs -n 1 cmd                  # 每次 1 个参数
xargs -P 4 cmd                  # 4 个并发
xargs -d '\n' cmd               # 自定义分隔符

实战片段

   bash
# 杀所有匹配进程
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 关键参数

   bash
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   # 删除(危险)

实战片段

   bash
# 找 /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:服务管理

关键参数

   bash
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>

实战片段

   bash
# 看服务状态
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

实战片段

   bash
service nginx status
service nginx restart

注意事项

  • service
     命令会调用 systemctl
  • 仅用于兼容性,新脚本用 systemctl

十五、文件与权限类命令

15.1 stat:文件元信息

实战片段

   bash
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 权限

实战片段

   bash
# 看 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:文件属性

实战片段

   bash
# 设为不可修改(重要文件用)
chattr +i /etc/passwd
lsattr /etc/passwd

# 设为只追加(日志用)
chattr +a /var/log/messages

注意事项

  • chattr +i
     防止文件被改、被删,但 root 也能解
  • chattr +a
     文件只能追加,不能修改
  • 误用 chattr +i 会让配置改不动,紧急时用 chattr -i

十六、资源限制类命令

16.1 ulimit:进程资源限制

关键参数

   bash
ulimit -a        # 所有限制
ulimit -n        # 文件描述符
ulimit -u        # 进程数
ulimit -s        # 栈大小
ulimit -t        # CPU 时间
ulimit -v        # 虚拟内存

实战片段

   bash
# 看所有限制
ulimit -a

# 临时修改(仅当前 shell)
ulimit -n 65535

# 永久修改
echo "ulimit -n 65535" >> /etc/profile

注意事项

  • ulimit
     在登录 shell 里设置才生效
  • systemd 服务的限制在 unit 文件里 LimitNOFILE=

16.2 /etc/security/limits.conf

实战片段

   bash
cat /etc/security/limits.conf

配置格式

   text
#<domain> <type> <item> <value>
* soft nofile 65535
* hard nofile 65535
root soft nofile 65535
root hard nofile 65535

注意事项

  • 修改后需要重新登录才生效
  • systemd 服务不读这个文件,要在 unit 里设置
  • *
     表示所有用户,但 root 可能需要单独设置

十七、配置示例汇总

17.1 进程信息收集脚本

   bash
#!/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 系统健康检查脚本

   bash
#!/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、网络、进程、日志、服务管理、文本处理、资源限制等所有常见排障场景。

最后给初中级运维工程师的几点建议:

  1. 每个命令都亲手敲一遍
    :看会不等于会
  2. 建立”现象 → 命令”的反射弧
    :先看现象,再想命令
  3. 做笔记
    :把所有命令的实战场景记下来
  4. 整理 Runbook
    :把命令按场景组织成可执行文档
  5. 风险意识
    :每个命令前先判断风险等级
  6. 持续学习
    :新工具(bpftrace、systemd-cgtop)持续关注
  7. 配合监控
    :命令 + 监控才能快速定位
  8. 复盘总结
    :每次故障后整理使用的命令

把这 50+ 个命令练成肌肉记忆,配合上监控告警和 Runbook,你就能在 5 分钟内从”业务慢了”走到”根因已定”,剩下就是按操作手册执行。

转自:马哥Linux运维

版权申明:内容来源网络,版权归原创者所有,如有侵权请联系删除

想了解更多干货,可通过下方扫码关注

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

未经允许不得转载:17认证网 » Linux 运维必会:这些命令不会,排障效率至少慢一半
分享到:0

评论已关闭。

400-663-6632
咨询老师
咨询老师
咨询老师