找回密码
立即注册
搜索
热搜: Java Python Linux Go
发回帖 发新帖

4066

积分

0

好友

536

主题
发表于 2 小时前 | 查看: 3| 回复: 0

为啥每次服务器半夜出问题,老手敲几条命令就能定位,而你的手却悬在键盘上不知道打什么?差距往往不在于懂不懂原理,而在于有没有一套熟练的、可以立即调用的命令组合拳。图形化工具虽好,但在生产环境里,尤其是在网络不通或系统卡顿的时候,能依赖的只有这些短小精悍的命令行工具。

本文把运维日常中10个最顶用的命令梳理了一遍,并附上组合排查思路。把它们练熟,下一次遇到“服务器连不上”、“CPU飙升”时,你就会从容得多。

1. 命令概述与分类

1.1 为什么要掌握这些命令

系统命令是运维工程师与服务器交互的基础工具。虽然现在有大量的自动化工具和平台,但掌握核心系统命令仍然是必要的。命令行工具响应速度快、不依赖图形界面、可以组合使用,非常适合应对复杂场景。在服务器故障的紧急情况下,命令行往往是最高效的诊断和处置手段。

运维工作中常见的问题场景包括:服务器SSH连接不上、业务响应超时、磁盘空间爆满、进程异常退出。这些问题的排查往往需要在命令行环境下进行快速诊断。掌握核心命令可以大幅缩短故障排查时间,提升运维效率。

一位熟练掌握系统命令的工程师,可以在几分钟内定位问题,而经验不足的工程师可能需要几小时。命令的组合使用可以应对各种复杂场景,这是图形化工具难以替代的。

1.2 命令分类

本文将10个核心命令分为五类:

  • 系统监控类:包括 topvmstatiostattop (或增强版 htop) 用于进程和资源监控;vmstat 用于虚拟内存统计;iostat 用于磁盘IO统计。这类命令可以帮你快速摸清系统当前的整体负载情况。
  • 网络诊断类:包括 netstatsstcpdumpnetstatss 用于查看网络连接状态;tcpdump 是网络抓包利器;lsof 则可以查看文件与端口的关联。它们是网络故障排查的核心。
  • 磁盘分析类:包括 dfdu,用于排查磁盘空间问题,快速定位哪些文件或目录占满了磁盘。
  • 文本处理类:包括 findawksed。这三者在日志分析和配置处理场景中使用极为频繁,是自动化运维的基石。
  • 服务管理类:包括 systemctl(及旧的 service 命令)和 rsyncsystemctl 用于管理后台服务,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 保存当前配置到文件

htoptop 的增强版,提供了更友好的彩色界面和更多功能。它支持鼠标操作,可水平滚动查看完整命令,并支持进程树视图。

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

ssnetstat 的现代替代品,速度更快,信息更详细。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) 可能看到它在某个 readconnect 调用上阻塞了,根据其文件描述符或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 服务器负载高排查

第一步:定方向。topvmstat 1 看一眼CPU的 us(用户进程)、sy(内核)、wa(IO等待)。哪个高就把排查重点放哪。

top
vmstat 1 5

第二步:找元凶。

  • CPU高 (us):top 界面按 P 排序,找出CPU占用最高的进程。如果是Java进程,top -Hp <PID> 找出高CPU的线程,再用 jstack <PID> 分析线程在干嘛。
  • IO高 (wa):vmstatb 列数字大,说明进程在等IO。马上用 iostat -xz 1 看哪个磁盘的 %util 满了。再用 iotop 找出是哪个进程在疯狂读写。
# 找最耗CPU的进程
ps aux --sort=-%cpu | head -10
# 找最耗内存的进程
ps aux --sort=-%mem | head -10

# 分析具体进程的IO情况
iotop -oP

3.2 网络连接问题排查

网络异常的排查是分层级的。

第一步:连通性测试。pingtraceroute 确认网络层是否可达。DNS问题则用 nslookupdig

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包也无响应时,就该检查 iptablesfirewalld 的规则了。

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 性能监控工具

  • htoptop 的终极增强版,必装。
  • 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个命令是你行走江湖最趁手的武器,但请记住,真正让你无往不利的,是能将它们信手拈来、组合出击的能力。

多在测试环境里动手敲一敲,试着把文中的排查流程完整走一遍。下次再遇到告警的时候,你就会发现,自己的手已经不再迷茫了。




上一篇:OpenClaw 生产环境配置与 Cron 任务自动化运维实战
下一篇:Claude Code 实战:单人一周复刻 Dify,AI Agent 平台开发全流程
您需要登录后才可以回帖 登录 | 立即注册

手机版|小黑屋|网站地图|云栈社区 ( 苏ICP备2022046150号-2 )

GMT+8, 2026-7-9 04:27 , Processed in 0.679293 second(s), 39 queries , Gzip On.

Powered by Discuz! X3.5

© 2025-2026 云栈社区.

快速回复 返回顶部 返回列表