为啥每次服务器半夜出问题,老手敲几条命令就能定位,而你的手却悬在键盘上不知道打什么?差距往往不在于懂不懂原理,而在于有没有一套熟练的、可以立即调用的命令组合拳。图形化工具虽好,但在生产环境里,尤其是在网络不通或系统卡顿的时候,能依赖的只有这些短小精悍的命令行工具。
本文把运维日常中10个最顶用的命令梳理了一遍,并附上组合排查思路。把它们练熟,下一次遇到“服务器连不上”、“CPU飙升”时,你就会从容得多。
1. 命令概述与分类
1.1 为什么要掌握这些命令
系统命令是运维工程师与服务器交互的基础工具。虽然现在有大量的自动化工具和平台,但掌握核心系统命令仍然是必要的。命令行工具响应速度快、不依赖图形界面、可以组合使用,非常适合应对复杂场景。在服务器故障的紧急情况下,命令行往往是最高效的诊断和处置手段。
运维工作中常见的问题场景包括:服务器SSH连接不上、业务响应超时、磁盘空间爆满、进程异常退出。这些问题的排查往往需要在命令行环境下进行快速诊断。掌握核心命令可以大幅缩短故障排查时间,提升运维效率。
一位熟练掌握系统命令的工程师,可以在几分钟内定位问题,而经验不足的工程师可能需要几小时。命令的组合使用可以应对各种复杂场景,这是图形化工具难以替代的。
1.2 命令分类
本文将10个核心命令分为五类:
- 系统监控类:包括
top、vmstat 和 iostat。top (或增强版 htop) 用于进程和资源监控;vmstat 用于虚拟内存统计;iostat 用于磁盘IO统计。这类命令可以帮你快速摸清系统当前的整体负载情况。
- 网络诊断类:包括
netstat、ss 和 tcpdump。netstat 和 ss 用于查看网络连接状态;tcpdump 是网络抓包利器;lsof 则可以查看文件与端口的关联。它们是网络故障排查的核心。
- 磁盘分析类:包括
df 和 du,用于排查磁盘空间问题,快速定位哪些文件或目录占满了磁盘。
- 文本处理类:包括
find、awk 和 sed。这三者在日志分析和配置处理场景中使用极为频繁,是自动化运维的基石。
- 服务管理类:包括
systemctl(及旧的 service 命令)和 rsync。systemctl 用于管理后台服务,rsync 则负责高效的数据同步。
2. 命令详解
2.1 top 与 htop
top 是 Linux 下最常用的进程监控工具,能实时显示系统整体状态和各进程的资源占用情况。默认每3秒刷新一次,可用 -d 参数调整间隔。
top输出解读
top 输出的第一行是系统负载信息,包含当前时间、运行时长、登录用户数以及1、5、15分钟的平均负载。负载数值如果持续高于CPU核心数,就说明系统存在性能瓶颈。
top - 10:15:30 up 100 days, 3:22, 2 users, load average: 1.25, 0.98, 0.85
第二行是进程统计信息,尤其要关注 zombie(僵尸进程)数,如果大于0,需要检查对应的父进程是否正常。
Tasks: 245 total, 3 running, 242 sleeping, 0 stopped, 0 zombie
第三行和第四行是CPU和内存使用情况汇总。CPU行中,us 代表用户空间占用,sy 代表内核空间占用,id 代表空闲。若 wa(等待I/O)的数值持续较高,则说明系统存在I/O瓶颈。
%Cpu(s): 25.3 us, 5.2 sy, 0.0 ni, 68.5 id, 0.0 wa, 0.8 hi, 0.2 si, 0.0 st
KiB Mem : 32768032 total, 8192000 free, 16384000 used, 8192032 buff/cache
进程列表默认按CPU使用率排序。在交互界面中,按 P(大写)切到CPU排序,M 切到内存排序,T 切到运行时间排序。按 q 键退出。
top 交互命令速查:
| 按键 |
功能 |
q |
退出 top |
P |
按CPU使用率排序 |
M |
按内存使用率排序 |
T |
按运行时间排序 |
1 |
切换显示每个CPU核心的状态 |
c |
显示完整的命令行 |
k |
终止一个进程 |
r |
调整进程优先级(nice值) |
u |
按用户过滤进程 |
n |
设置显示的进程数量 |
W |
保存当前配置到文件 |
htop 是 top 的增强版,提供了更友好的彩色界面和更多功能。它支持鼠标操作,可水平滚动查看完整命令,并支持进程树视图。
htop界面布局:
CPU [|||||||||||||||||||||||||||||||||||||||] 85%
Mem [|||||||||||||||||||||||||||||||||||||] 72%
Swp [|| ] 5%
PID USER PRI NI VIRT RES SHR S CPU% MEM% TIME+ Command
1234 nginx 20 0 128M 64M 12M R 45.2 12.5 15:32.11 nginx: worker
5678 mysql 20 0 2.1G 1.8G 156M S 25.0 5.5 2:45.33 mysqld
9012 redis 20 0 45M 32M 8M S 10.5 3.2 0:23.11 redis-server
htop 常用快捷键:
| 按键 |
功能 |
F1 |
帮助 |
F2 |
设置 |
F3 |
搜索进程 |
F4 |
过滤器 |
F5 |
树形视图 |
F6 |
排序 |
F7 / F8 |
调整进程的 nice 值 |
F9 |
发送信号给进程 |
F10 |
退出 |
实战场景:服务器响应卡顿,先用 top 查看哪个进程占用了最多的CPU或内存。如果发现某个Java进程CPU用到100%,下一步就要用 jstack 去分析它的线程堆栈了。
# 查找CPU占用最高的进程
top -c
# 查看特定用户的进程
top -u nginx
# 实时监控,每秒刷新
top -d 1
# 查看所有CPU核心的使用情况
# 注意:在 top 界面内按 '1',并非命令行参数 '- 1'
top # 进入后按 1
# 将 top 输出以批处理模式保存到文件
top -b -n 1 > top_output.txt
2.2 netstat 与 ss
netstat 是查看网络连接状态的经典命令。最常用的参数组合是 -anp:-a 显示所有连接,-n 不解析域名,-p 显示进程信息。
netstat -anp
Active Internet connections (servers and established)
Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name
tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN 1234/sshd
tcp 0 48 10.0.0.5:22 192.168.1.100:54321 ESTABLISHED 1234/sshd
tcp 0 0 127.0.0.1:631 0.0.0.0:* LISTEN 4567/cupsd
tcp 0 0 0.0.0.0:3306 0.0.0.0:* LISTEN 7890/mysqld
TCP常见连接状态说明:
| 状态 |
说明 |
LISTEN |
正在监听端口,等待客户端连接 |
ESTABLISHED |
连接已建立,正在传输数据 |
TIME_WAIT |
连接已关闭,等待足够时间以确保远端收到确认 |
CLOSE_WAIT |
对端已关闭,等待本地应用程序关闭连接 |
SYN_SENT |
正在发送连接请求 |
SYN_RECV |
收到了连接请求并已确认,等待最终ACK |
FIN_WAIT1 |
本端主动关闭,已发送FIN报文 |
FIN_WAIT2 |
本端收到ACK,正在等待对端的FIN报文 |
CLOSING |
双方同时尝试关闭连接 |
LAST_ACK |
对端已关闭,本端正等待最后一个ACK |
利用 netstat 可以方便地统计连接状况。
# 统计已建立的(ESTABLISHED)连接数量
netstat -an | grep ESTABLISHED | wc -l
# 统计处于TIME_WAIT状态的连接数量
netstat -an | grep TIME_WAIT | wc -l
# 统计TCP各状态的连接数量
netstat -an | awk '/^tcp/ {print $6}' | sort | uniq -c
# 查看所有监听中的TCP端口
netstat -lntp
# 查看所有TCP连接
netstat -anp | grep tcp
# 查看访问特定端口(如80)的连接
netstat -anp | grep :80
# 查看网络协议统计信息
netstat -s
ss 是 netstat 的现代替代品,速度更快,信息更详细。ss -tunap 可以列出所有TCP和UDP的socket信息。
ss -tunap
Netid State Recv-Q Send-Q Local Address:Port Peer Address:Port Process
tcp LISTEN 0 128 0.0.0.0:22 0.0.0.0:* users:(("sshd",pid=1234,fd=3))
tcp ESTAB 0 0 10.0.0.5:22 192.168.1.100:54321 users:(("sshd",pid=5678,fd=4))
tcp LISTEN 0 80 0.0.0.0:3306 0.0.0.0:* users:(("mysqld",pid=7890,fd=10))
udp UNCONN 0 0 0.0.0.0:68 0.0.0.0:* users:(("dhclient",pid=1011,fd=5))
在高并发、大量连接的情况下,ss 几乎是即时返回结果,而 netstat 可能会卡顿数秒。ss 的过滤功能也更强大。
# 查看所有TCP连接
ss -t
# 查看所有UDP连接
ss -u
# 查看所有正在监听的 sockets
ss -l
# 显示进程信息
ss -p
# 显示概要统计
ss -s
# 过滤特定状态的连接,例如established
ss -t state established
# 过滤源端口为80的连接
ss -t sport = :80
# 过滤目标地址为10.0.0.1的连接
ss -t dst 10.0.0.1
# 组合过滤:查看与HTTP端口相关的已建立连接
ss -t state established '( sport = :http or dport = :http )'
# 显示详细信息,最常用组合
ss -tunap
实战场景:服务端口(如8080)连接数异常,导致新用户无法连接。用 ss -s 快速看整体统计,然后用 ss -tan dst :8080 查看所有连接到8080的客户端,找出发起大量连接的异常IP。
# 统计连接状态分布
ss -s
# 查看访问本机8080端口的所有连接
ss -tan dst :8080
# 查看来自特定IP的连接
ss -tan src 192.168.1.100
# 查看连接数最多的前10个IP
ss -tan | awk '{print $5}' | cut -d: -f1 | sort | uniq -c | sort -rn | head -10
# 查看socket缓冲区大小
ss -tm
# 查看TCP连接的详细信息,如定时器
ss -ti
2.3 lsof
lsof (list open files) 用于查看进程打开了哪些文件。在Linux“一切皆文件”的设计哲学下,它不仅能看到普通文件,还能看到网络连接、管道等。
lsof -p 1234
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
nginx 1234 nginx cwd DIR 253,1 4096 128 /
nginx 1234 nginx rtd DIR 253,1 4096 128 /
nginx 1234 nginx txt REG 253,1 123456 1024 /usr/sbin/nginx
nginx 1234 nginx mem REG 253,1 789012 2048 /lib/x86_64/libcrypto.so
nginx 1234 nginx 0r CHR 1,3 0t0 1024 /dev/null
nginx 1234 nginx 1w REG 253,1 123456 4096 /var/log/nginx/access.log
nginx 1234 nginx 2w REG 253,1 8192 4100 /var/log/nginx/error.log
nginx 1234 nginx 3u IPv4 12345 0t0 TCP *:80 (LISTEN)
nginx 1234 nginx 4u IPv4 12346 0t0 TCP *:443 (LISTEN)
常用参数:-i 显示网络文件,-p 指定进程ID,-u 指定用户,-c 指定命令名。
# 查看占用80端口的进程
lsof -i:80
# 查看所有网络连接
lsof -i
# 按协议查看网络连接
lsof -i TCP
lsof -i UDP
# 查看特定进程打开的文件
lsof -p 1234
# 查看特定用户打开的所有文件
lsof -u nginx
# 查看指定命令打开的文件
lsof -c nginx
# 查看某目录下被哪些进程占用的文件
lsof +D /var/log
# 递归查看
lsof +D /var/log/nginx/
# 查看指定文件被哪些进程占用
lsof /var/log/nginx/access.log
# 查看IPv6连接
lsof -i6
# 查看一个端口范围内的连接
lsof -i:80-443
经典场景:df -h 显示磁盘空间满了,但 du -sh /* 却死活找不到大文件。这很可能是有进程还在写一个已经被删除的日志文件。此时用 lsof +L1 就能揪出这个进程和对应的“幽灵”文件。
# 查找并列出所有链接计数为0(已删除但仍被进程占用)的文件
lsof +L1
# 检查某个进程打开的文件数量
lsof -p 1234 | wc -l
# 查看某个用户的所有网络连接
lsof -a -u nginx -i
# 查看所有处于监听状态的TCP sockets
lsof -i -sTCP:LISTEN
# 查看网络文件系统(NFS)相关的打开文件
lsof -N
2.4 df 与 du
df (disk free) 是排查磁盘空间问题的第一站,用于整体查看文件系统的使用情况。-h 参数以人类易读的格式显示。
df -h
Filesystem Size Used Avail Use% Mounted on
/dev/sda1 100G 45G 55G 45% /
/dev/sda2 200G 120G 80G 60% /var/lib/kubelet
/dev/sdb1 500G 300G 200G 60% /var/lib/containerd
tmpfs 64M 0 64M 0% /dev/shm
tmpfs 7.8G 12M 7.8G 1% /run
/dev/mapper/centos-home
50G 48G 2G 96% /home
除了容量,inode的消耗同样致命。df -i 可以查看inode使用率。当inode耗尽时,即使磁盘空间充裕,也无法创建任何新文件。这种情况常见于存在海量小文件的目录。
df -i
Filesystem Inodes IUsed IFree IUse% Mounted on
/dev/sda1 6553600 234567 6319033 4% /
/dev/sda2 32768000 456789 32311211 2% /var
/dev/mapper/centos-home
3276800 123456 3153344 4% /home
du (disk usage) 用于定位具体是哪些目录或文件占用了空间,是精细化排查的利器。
du -sh /var
45G /var
du -sh /var/*
12G /var/log
8G /var/lib
5G /var/cache
20G /var/spool
高级用法:按大小排序、限制分析深度、按时间筛选。
# 查看当前目录下各子目录的大小
du -sh *
# 查看特定目录的大小
du -sh /var/log
# 显示文件和目录大小
du -ah /var/log
# 按大小排序显示
du -sh * | sort -h
# 限制深度为1,查看第一层目录的大小
du -ah --max-depth=1 /var
# 显示修改时间
du -sh --time=modification /var/*
# 排除特定文件,如所有.log文件
du -sh --exclude='*.log' /var
# 查看所有文件系统,包括伪文件系统
df -ah
# 查看inode使用情况
df -i
# 统计某类型文件的大小总和
find /var -name "*.log" -exec du -ch {} + | tail -1
实战场景:磁盘告警。先用 df -h 确定是哪个文件系统出问题,然后从该文件系统的根目录开始,用 du -h --max-depth=1 /path 逐级下钻,直到找到“元凶”——通常是某个忘了清理的日志或缓存目录。
# 从根目录开始逐级排查
du -h --max-depth=1 /
# 查看特定目录下最大的10个文件
find /var -type f -exec du -h {} + | sort -rh | head -10
# 查看日志文件大小分布
find /var/log -type f -name "*.log" -exec du -h {} + | sort -rh
# 查看用户的目录使用情况
du -sh /home/*
2.5 iostat 与 vmstat
iostat (I/O statistics) 专门用来监控系统磁盘I/O和CPU使用情况。iostat -xz 1 是一个经典的诊断组合,每秒输出一次详细的扩展统计。
iostat -xz 1
Linux 6.1.0-k8s (node-1) 03/20/2026 _x86_64_ (4 CPU)
avg-cpu: %user %nice %system %iowait %steal %idle
15.23 0.00 5.12 2.34 0.00 77.31
Device: rrqm/s wrqm/s r/s w/s rkB/s wkB/s avgrq-sz avgqu-sz await r_await w_await %util
sda 0.12 12.34 2.45 45.67 198.23 4567.89 98.45 1.23 5.67 2.34 6.12 5.67
sdb 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00
关键指标解读:
%util:设备利用率。如果接近100%,说明该设备已经达到了I/O瓶颈。
await:单个I/O请求的平均等待时间。如果持续高,说明I/O延迟大。
avgqu-sz:平均I/O队列长度。队列过常也代表设备繁忙。
vmstat (virtual memory statistics) 则更侧重于系统整体的虚拟内存、进程和CPU上下文切换情况。
vmstat 1
procs -----------memory---------- ---swap-- -----io---- -system-- ------cpu-----
r b swpd free buff cache si so bi bo in cs us sy id wa st
3 0 0 2048576 312456 4567890 0 0 5 12 1234 8567 25 5 68 2 0
关键列说明:
r(运行队列):正在等待CPU运行的进程数。持续超过CPU核心数说明CPU不足。
b(阻塞队列):正在等待I/O等资源而阻塞的进程数。
si/so:每秒从交换区换入/换出的内存量。大于0表示物理内存不足。
bi/bo:每秒从块设备读/写的块数。
in/cs:每秒中断次数和上下文切换次数。
us/sy/id/wa:CPU分别在用户态、内核态、空闲和等待I/O的百分比。
# 每秒输出一次,共输出5次
vmstat 1 5
# 显示详细的内存统计信息(以MB为单位展示)
vmstat -S m -s
# 显示磁盘的读写统计
vmstat -d
实战场景:用户反馈系统慢,top 看CPU id 很高,但 load average 同样很高。这是一个典型信号:可能有大量进程在等待I/O。此时用 vmstat 1 关注 b 列和 wa 列,并用 iostat -xz 1 确认是哪个磁盘的 %util 接近饱和。
# 综合诊断
iostat -xz 1 &
vmstat 1 &
pidstat -d 1
# 持续5秒监控CPU和IO关系
iostat -x 1 5
# 监控特定磁盘(如sda)
iostat -p sda 1
2.6 strace 与 ltrace
strace 是诊断程序“卡死”、“行为诡异”等疑难杂症的终极大杀器,它能追踪一个进程执行的所有系统调用。
strace -c -p PID 可以附带统计功能,在进程结束后输出各类系统调用的耗时和次数汇总,是寻找性能瓶颈的神器。
strace -c -p 1234
strace: Process 1234 attached
^Cstrace: Process 1234 detached
% time seconds usecs/call calls errors syscall
------ ----------- ----------- --------- --------- ----------------
45.23 0.123456 123 1000 read
25.67 0.070123 70 1000 write
15.34 0.041890 41 1000 select
10.12 0.027654 27 1000 fcntl
3.45 0.009432 10 1000 gettimeofday
------ ----------- ----------- --------- --------- ----------------
100.00 0.272555 5000 total
-T 参数会显示每个调用的耗时,-tt 则能打印出微秒级别的时间戳,这对精确定位耗时的调用非常有帮助。
# 追踪一个正在运行的进程
strace -p 1234
# 追踪并显示程序指针(instruction pointer)
strace -i -p 1234
# 耗时统计模式
strace -c -p 1234
# 显示每次调用的耗时
strace -T -p 1234
# 显示带微秒的时间戳
strace -tt -p 1234
# 只追踪特定类型的系统调用,如网络相关
strace -e trace=network -p 1234
# 追踪子进程
strace -f -p 1234
# 将追踪结果输出到文件
strace -o /tmp/strace.log -p 1234
ltrace 用于追踪进程调用的动态库函数,是 strace 的补充。
# 追踪库函数调用
ltrace -p 1234
# 统计库函数调用耗时与次数
ltrace -c -p 1234
# 只追踪特定的库函数,如内存分配相关的
ltrace -e malloc,free -p 1234
实战场景:一个Python程序运行十来分钟后就会突然卡住,不响应任何请求。通过 strace -p $(pgrep python) 可能看到它在某个 read 或 connect 调用上阻塞了,根据其文件描述符或IP地址,就能立刻明白它在等什么。
# 针对Nginx worker进程,统计其系统调用构成
strace -p $(pgrep -f "nginx: worker" | head -1) -c
# 分析进程当前正在做什么(抓取前50行输出)
strace -p 1234 2>&1 | head -50
# 追踪失败的open调用,排查文件不存在或权限问题
strace -e trace=open,openat -p 1234 2>&1 | grep -E "ENOENT|Permission"
# 启动一个命令并全程追踪其系统调用
strace -f -o /tmp/trace.log <command>
2.7 tcpdump
tcpdump 是命令行下的网络抓包利器,它会将网卡置于混杂模式捕获数据包。tcpdump -i eth0 -nn host 10.0.0.1 是一个很常用的基本命令,-nn 表示不把IP和端口解析成主机名和服务名。
tcpdump -i eth0 -nn host 10.0.0.1
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on eth0, link-type EN10MB (Ethernet), capture size 262144 bytes
10:15:30.123456 IP 10.0.0.1.443 > 10.0.0.2.54321: Flags [P.], seq 12345:12356, ack 67890, win 502, length 11
10:15:30.123789 IP 10.0.0.2.54321 > 10.0.0.1.443: Flags [.], ack 12356, win 502, length 0
看懂TCP标志位是分析故障的关键:[S] 代表SYN(建立连接),[F] 代表FIN(断开连接),[P] 代表PUSH(数据传输),[R] 代表RST(重置连接)。你经常能通过 [S] 后没有回复或者回复 [R] 来判断连接被拒绝。
tcpdump 的真正强大之处在于它的Berkeley Packet Filter (BPF)过滤表达式,能做到精准捕获。
# 捕获任何接口上与主机10.0.0.1的通信
tcpdump -i any host 10.0.0.1
# 捕获任何接口上80端口的流量
tcpdump -i any port 80
# 组合条件:监听eth0上,主机10.0.0.1的80端口流量
tcpdump -i eth0 host 10.0.0.1 and port 80
# 显示完整数据包内容(十六进制和ASCII)
tcpdump -i any -X
# 将捕获的原始数据包保存到文件,供后续分析
tcpdump -i any -w /tmp/capture.pcap
# 从文件中读取并分析
tcpdump -r /tmp/capture.pcap
# 只捕获特定数量的包后自动停止
tcpdump -i any -c 100
# 捕获所有TCP的SYN包(新连接)
tcpdump -i any 'tcp[tcpflags] & (tcp-syn) != 0 and tcp[tcpflags] & (tcp-ack) == 0'
配合 Wireshark 这样更直观的图形化分析工具,可以在服务器上通过 tcpdump -w 把包抓下来,再到本地进行深入的协议分析,如TCP流重组、统计图表等。
实战场景:用户抱怨“能ping通,但服务连不上”。可以先 telnet <ip> <port> 确认端口不通,然后到服务器上用 tcpdump -i any port <port> -nn 抓包。如果能看到客户端发来的 [S] (SYN) 包,但服务器没有任何 [S.] (SYN-ACK) 回应,问题很可能就在服务器本地的防火墙 (iptables) 或者服务本身没监听到正确的IP。
# 捕获所有HTTP GET请求
tcpdump -i any -A 'tcp port 80 and tcp[((tcp[12:1] & 0xf0) >> 2):2] = 0x474554'
# 捕获DNS请求和响应
tcpdump -i any -A 'udp port 53'
# 捕获TCP重传包(是网络质量差的重要标志)
tcpdump -i any 'tcp[tcpflags] & (tcp-retrans) != 0'
# 捕获SSL/TLS握手(Client Hello)
tcpdump -i any 'tcp[((tcp[12:1] & 0xf0) >> 2):4] = 0x160301'
# 分析网络延迟,-tttt 显示带日期的详细时间戳
tcpdump -i any -tttt 'tcp port 80'
2.8 find、awk 与 sed
这三者经常组合成“管道流水线”来处理运维中的数据。
find:在目录树中按条件查找文件。
# 按名称查找所有.log文件
find /path -name "*.log"
# 按类型查找(f普通文件,d目录)
find /path -type f
# 按大小查找大于100MB的文件
find /path -size +100M
# 按时间查找7天内修改过的文件
find /path -mtime -7
# 查找空文件并删除
find /path -type f -empty -delete
# 查找指定用户的文件
find /path -user nginx
# 对查找到的文件执行操作(注意 \; 结尾)
find /path -name "*.tmp" -exec rm {} \;
awk:流式文本处理语言,尤其适合处理列数据。
# 打印文本文件的第1和第3列
awk '{print $1, $3}' file
# 使用冒号作为分隔符,打印每行第1列
awk -F: '{print $1}' /etc/passwd
# 对第3列求和并在最后打印结果
awk '{sum+=$3} END {print sum}' file
# 按条件过滤(第3列大于100的行)
awk '$3 > 100 {print $0}' file
awk在日志分析中的实战:
# 分析Nginx日志(假设格式包含 $remote_addr, $status, $body_bytes_sent 等)
# 日志格式: $remote_addr - - [$time_local] "$request" $status $body_bytes_sent ...
# 访问量前20的IP地址
awk '{print $1}' access.log | sort | uniq -c | sort -rn | head -20
# 状态码分布统计
awk '{print $9}' access.log | sort | uniq -c | sort -rn
# 统计总流量(以MB为单位,$10是body_bytes_sent)
awk '{sum+=$10} END {print sum/1024/1024 " MB"}' access.log
# 统计所有5xx错误的请求数
awk '$9 >= 500 {count++} END {print count}' access.log
sed:流编辑器,常用于文本查找替换。
# 将文件中的所有"old"替换为"new"
sed 's/old/new/g' file
# 直接原地修改文件(不带备份)
sed -i 's/old/new/g' file
# 原地修改并生成.bak备份文件
sed -i.bak 's/old/new/g' file
# 删除匹配"pattern"的行
sed '/pattern/d' file
# 只打印第10到第20行
sed -n '10,20p' file
# 去除行首的空白字符
sed 's/^[ \t]*//' file
# 替换日志中的敏感信息,如密码参数
sed -i 's/password=[^&]*/password=REDACTED/g' app.log
2.9 rsync
rsync 是一个高效灵活的文件同步工具,其核心优势在于增量传输。它会对比源和目标的文件差异,只传输有变化的部分。
# 本地同步目录(注意源路径末尾的斜杠有区别)
rsync -avz source/ dest/
# 远程同步:推送本地目录到远程服务器
rsync -avz source/ user@host:/dest/
# 远程同步:从远程服务器拉取目录
rsync -avz user@host:/source/ dest/
# 使用SSH指定端口同步
rsync -avz -e "ssh -p 2222" source/ user@host:/dest/
# 删除目标端比源端多的文件,实现完全镜像同步
rsync -avz --delete source/ dest/
# 模拟执行 (dry-run),只看会做什么,不实际执行
rsync -avzn source/ dest/
# 排除所有 .git 和 node_modules 目录
rsync -avz --exclude='.git' --exclude='node_modules' source/ dest/
实战场景:将本地代码同步到多台线上Web服务器。
# 保持一台测试服务器与正式环境代码一致
rsync -avz --delete /var/www/html/ user@web-server:/var/www/html/
# 一个循环脚本同步到多台服务器
for host in web1 web2 web3; do
rsync -avz /var/www/html/ user@$host:/var/www/html/
done
2.10 systemctl 与 service
在现代Linux发行版中,systemctl 是管理 systemd 系统和服务管理器的主要工具。
# 服务生命周期管理
systemctl start nginx # 启动服务
systemctl stop nginx # 停止服务
systemctl restart nginx # 重启服务
systemctl reload nginx # 重新加载配置文件(不中断服务)
systemctl enable nginx # 设置开机自启
systemctl disable nginx # 禁止开机自启
systemctl daemon-reload # 修改service文件后,必须重载配置
# 查看服务状态与日志
systemctl status nginx # 查看服务的详细运行状态
journalctl -u nginx # 查看服务的所有日志
journalctl -u nginx -f # 实时跟踪日志输出
journalctl -u nginx --since "1 hour ago" # 按时间筛选日志
service 命令是对传统SysV init脚本的兼容命令,在较老的系统上还能见到。
service nginx start
service nginx stop
service nginx status
service --status-all # 列出所有服务的状态
一个标准的 systemd 服务单元文件 (nginx.service):
[Unit]
Description=nginx HTTP Server
Documentation=https://nginx.org/en/docs/
After=network.target
[Service]
Type=forking
PIDFile=/run/nginx.pid
ExecStart=/usr/sbin/nginx -g daemon on; master_process on;
ExecReload=/bin/kill -s HUP $MAINPID
ExecStop=/bin/kill -s QUIT $MAINPID
PrivateTmp=true
Restart=always
RestartSec=5
[Install]
WantedBy=multi-user.target
服务故障排查流程:
# 1. 看状态(会显示最后几行日志和进程信息)
systemctl status nginx
# 2. 看详细日志
journalctl -u nginx -n 100 --no-pager
# 3. 测试配置文件语法
nginx -t
# 4. 确认服务是否在监听端口
ss -tlnp | grep nginx
# 5. 检查进程是否存在
ps aux | grep nginx
3. 命令组合实战场景
想成为排障高手,关键在于能把零散的命令组合成一套诊断逻辑。
3.1 服务器负载高排查
第一步:定方向。 用 top 或 vmstat 1 看一眼CPU的 us(用户进程)、sy(内核)、wa(IO等待)。哪个高就把排查重点放哪。
top
vmstat 1 5
第二步:找元凶。
- CPU高 (us):
top 界面按 P 排序,找出CPU占用最高的进程。如果是Java进程,top -Hp <PID> 找出高CPU的线程,再用 jstack <PID> 分析线程在干嘛。
- IO高 (wa):
vmstat 的 b 列数字大,说明进程在等IO。马上用 iostat -xz 1 看哪个磁盘的 %util 满了。再用 iotop 找出是哪个进程在疯狂读写。
# 找最耗CPU的进程
ps aux --sort=-%cpu | head -10
# 找最耗内存的进程
ps aux --sort=-%mem | head -10
# 分析具体进程的IO情况
iotop -oP
3.2 网络连接问题排查
网络异常的排查是分层级的。
第一步:连通性测试。 用 ping 和 traceroute 确认网络层是否可达。DNS问题则用 nslookup 或 dig。
ping -c 4 8.8.8.8
traceroute 8.8.8.8
nslookup google.com
第二步:端口与服务状态。 网络通但业务访问不了,问题大概率在传输层或应用层。用 ss -tlnp 看服务有没有在正确的IP和端口上监听,用 ss -s 快速了解连接数的整体情况。
# 看看谁在监听80端口
ss -tlnp | grep :80
# 看看连接状态分布,TIME_WAIT过多也需要关注
ss -s
netstat -an | awk '/^tcp/ {print $6}' | sort | uniq -c
第三步:抓包见真章。 前两步还找不到问题,就用 tcpdump。在客户端和服务器端同时抓包,分析TCP三次握手是否完成、有没有收到RST包、有没有大量重传。
# 精准抓取与某主机某端口的交互包,写在文件里带回本地分析
tcpdump -i any host target_ip and port target_port -w capture.pcap
第四步:检查防火墙。 抓包发现即使服务器端口在监听,SYN包也无响应时,就该检查 iptables 或 firewalld 的规则了。
iptables -L -n -v
firewall-cmd --list-all
3.3 磁盘空间问题排查
这个场景相对固定,遵循“由总体到局部”的原则。
第一步:宏观了解。df -h 看哪个分区快满了。
第二步:逐级下钻。 从问题分区的挂载点根目录开始,du -h --max-depth=1 / 一级一级往下找。
第三步:重点清理。 定位到具体的“大户”目录后,用 find 配合 -size 或 -mtime 找出可以清理的大文件或旧日志,并结合 日志分析与自动化脚本 中的思路,建立自动清理任务。
# 找出大于100M的文件
find /var -type f -size +100M -exec ls -lh {} \;
# 务必检查是否有已删除但未释放的“幽灵文件”
lsof +L1
4. 命令选择决策树
让你在面对问题时,能条件反射般地选对工具。
1. 系统卡顿/响应慢
- →
vmstat 1 5 (宏观看是CPU、内存还是I/O问题)
- →
top / htop (找耗时进程)
- → 如果是CPU高 →
pidstat -p PID 1
- → 如果是I/O高 →
iostat -xz 1 / iotop
2. 网络连接异常
- →
ping / traceroute (基础连通性)
- →
ss -tlnp (服务监听状态)
- →
ss -s / netstat -an | awk ... (连接统计)
- →
tcpdump -i any port XXXX -nn (抓包分析)
3. 磁盘空间问题
- →
df -h (整体使用率)
- →
df -i (inode使用率)
- →
du -h --max-depth=1 /path (逐级排查)
- →
find /path -type f -size +1G (查找大文件)
4. 进程/服务异常
- →
ps aux / pstree (进程信息)
- →
lsof -p PID / lsof -i (文件与网络关联)
- →
strace -p PID (追踪行为)
5. 进阶命令与工具链
基础命令之上,构建一个完善的工具链能让监控和排障效率再上一个台阶。
5.1 性能监控工具
htop:top 的终极增强版,必装。
iotop:按进程查看实时磁盘I/O。
iftop:按连接查看实时网络带宽。
nethogs:按进程查看实时网络带宽。
# 几个工具的常用安装和运行方式
# apt-get install htop iotop iftop nethogs
# htop 过滤某个用户的进程
htop -u nginx
# iotop 只显示有IO活动的进程
iotop -o
# iftop 在网络接口em0上不解析主机名
iftop -i em0 -n
5.2 日志分析工具
goaccess:实时分析Web日志,并可以生成HTML报告。
lnav:高级日志文件查看器,支持语法高亮、多文件同时监控。
goaccess access.log -o report.html --log-format=COMBINED
# 同时打开并监控一个目录下的所有日志
lnav /var/log/nginx/*.log
5.3 5步标准化故障排查流程
这是个通用思路,可以套用到任何故障场景中。
Phase 1: 信息收集
uname -a; hostname; uptime; cat /etc/os-release
df -h; free -h; top -bn1 | head -20
Phase 2: 网络诊断
ping -c 4 8.8.8.8; traceroute 8.8.8.8; nslookup google.com
ss -tlnp; netstat -an | grep ESTABLISHED
Phase 3: 进程与服务
ps aux | head -20; pstree -p
systemctl status nginx; journalctl -u nginx -n 50
Phase 4: 日志分析
tail -100 /var/log/syslog
tail -100 /var/log/nginx/error.log
Phase 5: 资源深度分析
# CPU: vmstat 1 5; mpstat -P ALL 1
# I/O: iostat -xz 1; iotop
# Memory: free -m; cat /proc/meminfo
命令是运维的“招式”,而对系统原理的理解和清晰的排障思路才是“内功”。这10个命令是你行走江湖最趁手的武器,但请记住,真正让你无往不利的,是能将它们信手拈来、组合出击的能力。
多在测试环境里动手敲一敲,试着把文中的排查流程完整走一遍。下次再遇到告警的时候,你就会发现,自己的手已经不再迷茫了。