运维工程师必须掌握的10个系统命令

描述

1. 命令概述与分类

1.1 为什么要掌握这些命令

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

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

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

1.2 命令分类

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

系统监控类包括top、htop用于进程和资源监控;vmstat用于虚拟内存统计;iostat用于磁盘IO统计。这类命令帮助运维人员快速了解系统负载情况。

网络诊断类包括netstat、ss用于网络连接状态查看;tcpdump用于网络数据包抓取;lsof用于文件与端口关联查看。这类命令是网络故障排查的利器。

磁盘分析类包括df、du用于磁盘空间分析。这类命令帮助运维人员快速定位磁盘空间问题。

文本处理类包括find、awk、sed用于文本搜索和处理。这类命令在日志分析和配置处理场景中使用频繁。

服务管理类包括systemctl、service用于服务启停管理;rsync用于数据同步。这类命令是日常运维的基本操作。

2. 命令详解

2.1 top与htop

top是Linux下最常用的进程监控命令,实时显示系统的整体状态和各个进程的资源占用情况。top默认每3秒刷新一次数据,可以通过-d参数调整刷新间隔。

top输出的第一行是系统负载信息,包含当前时间、系统运行时间、当前登录用户数、1分钟/5分钟/15分钟平均负载。负载数值如果持续高于CPU核心数,说明系统存在性能瓶颈。

 

top - 1030 up 100 days,  3:22,  2 users,  load average: 1.25, 0.98, 0.85

 

load average的三个数字分别代表1分钟、5分钟、15分钟的平均负载。判断负载是否过高需要结合CPU核心数:8核CPU的负载不超过8算正常,超过8说明负载过高。

第二行是进程统计信息,显示总进程数、运行中的进程数、睡眠中的进程数、停止的进程数、僵尸进程数。僵尸进程数如果大于0,需要检查对应的父进程。

 

Tasks: 245 total,   3 running, 242 sleeping,   0 stopped,   0 zombie

 

第三行和第四行是CPU和内存使用情况的汇总。CPU行的us表示用户空间占用比例,sy表示内核空间占用比例,id表示空闲比例。如果wa(等待IO)数值持续较高,说明系统存在IO瓶颈。

 

%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。

top交互命令汇总:

按键 功能
q 退出top
P 按CPU使用率排序
M 按内存使用率排序
T 按运行时间排序
1 切换显示每个CPU核心
c 显示完整命令行
k 终止进程
r 调整进程优先级
u 按用户过滤
n 设置显示进程数量
W 保存配置到文件

htop是top的增强版本,提供了更友好的界面和更多功能。htop支持鼠标操作,颜色区分不同类型进程,可以水平滚动查看完整命令行参数。htop还可以直接向进程发送信号,支持进程树视图。

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

# 保存top输出到文件
top -b -n 1 > top_output.txt

 

2.2 netstat与ss

netstat是查看网络连接状态的经典命令,可以显示网络协议统计信息和网络连接状态。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

 

netstat的输出包含协议类型、本地地址、外部地址、状态、进程ID和进程名称。状态列显示TCP连接的状态,常见状态包括LISTEN(监听中)、ESTABLISHED(已建立)、TIME_WAIT(等待关闭)、CLOSE_WAIT(等待关闭)。

TCP连接状态说明:

状态 说明
LISTEN 等待连接,服务器socket正在监听
ESTABLISHED 连接已建立,双方可以传输数据
TIME_WAIT 等待足够时间确保对方收到关闭请求
CLOSE_WAIT 等待本地应用程序关闭连接
SYN_SENT 正在发送连接请求
SYN_RECV 收到连接请求并发送确认
FIN_WAIT1 主动关闭,发送FIN
FIN_WAIT2 收到确认,等待对方关闭
CLOSING 双方同时关闭
LAST_ACK 最后确认,等待接收

使用netstat可以统计当前各种状态的连接数量:

 

# 统计ESTABLISHED连接数量
netstat -an | grep ESTABLISHED | wc -l

# 统计TIME_WAIT连接数量
netstat -an | grep TIME_WAIT | wc -l

# 统计各状态的连接数量
netstat -an | awk '/^tcp/ {print $6}' | sort | uniq -c

# 查看监听中的端口
netstat -lntp

# 查看所有TCP连接
netstat -anp | grep tcp

# 查看特定端口的连接
netstat -anp | grep :80

# 查看网络统计信息
netstat -s

 

ss是netstat的现代替代工具,采用iproute2架构,性能更好且输出信息更详细。ss -tunap可以列出所有TCP和UDP连接,显示完整的五元组信息和进程信息。

 

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的优势在于查询速度。在大量连接的场景下,netstat可能需要数秒才能返回结果,ss几乎是即时返回。ss还支持更多的过滤条件。

 

# 查看所有TCP连接
ss -t

# 查看所有UDP连接
ss -u

# 查看监听中的 sockets
ss -l

# 显示进程信息
ss -p

# 显示概要统计
ss -s

# 过滤特定状态
ss -t state established

# 过滤特定端口
ss -t sport = :80

# 过滤特定地址
ss -t dst 10.0.0.1

# 组合过滤
ss -t state established '( sport = :http or dport = :http )'

# 显示详细信息
ss -tunap

 

使用场景举例:服务端口连接数过多导致性能下降时,使用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通过分析内核的进程文件表获取信息。

 

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)

 

lsof的常用参数包括:-i显示网络连接文件,-p指定进程ID,-u指定用户,-c指定命令名称。不带参数运行lsof会列出所有打开的文件,信息量很大,通常需要配合过滤条件使用。

 

# 查看占用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

# 查看X Window连接
lsof -i @localhost:6000

 

使用场景举例:磁盘空间显示已满,但找不到大文件时,使用lsof +D /path检查是否有进程打开了已删除的文件。文件删除后,磁盘空间不会立即释放,只有进程关闭文件句柄后才会释放。

 

# 检查打开已删除文件的进程
lsof +L1

# 检查打开大量文件的进程
lsof -p 1234 | wc -l

# 查看某个用户的所有网络连接
lsof -a -u nginx -i

# 查看所有Listening sockets
lsof -i -sTCP:LISTEN

# 查看网络文件系统
lsof -N

# 查看字符设备
lsof -c ^nginx

# 查看Unix Domain Socket
lsof -U

# 查看FD类型
lsof -d txt,mem

# 检查特定UID用户
lsof -u 1000

# 组合条件
lsof -u nginx -i -a -p 1234

 

2.4 df与du

df(disk free)用于查看文件系统磁盘空间使用情况,是排查磁盘空间问题的第一个命令。df -h以人类可读格式显示,-T显示文件系统类型。

 

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

 

df的输出包含文件系统名称、总大小、已用大小、可用大小、已用百分比、挂载点。已用百分比是判断磁盘空间是否紧张的关键指标,建议设置告警阈值。

inode使用情况也需要关注。df -i显示inode使用情况。inode用于存储文件的元数据,当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 /path显示指定路径的总大小,-h以人类可读格式,-s汇总统计。du -sh *显示当前目录下各子目录的大小。

 

du -sh /var
45G     /var

du -sh /var/*
12G     /var/log
8G      /var/lib
5G      /var/cache
20G     /var/spool

 

du支持按时间排序。du --time -sh *按修改时间显示大小。du -ah --max-depth=1显示指定深度的文件分布情况。

 

# 查看当前目录各子目录大小
du -sh *

# 查看特定目录大小
du -sh /var/log

# 显示文件大小
du -ah /var/log

# 按大小排序显示
du -sh * | sort -h

# 显示目录和文件大小(限制深度)
du -ah --max-depth=1 /var

# 显示修改时间
du -sh --time=modification /var/*

# 排除特定目录
du -sh --exclude='*.log' /var

# 查看所有文件系统使用情况
df -ah

# 查看inode使用情况
df -i

# 统计某类型文件大小
find /var -name "*.log" -exec du -ch {} + | tail -1

# 查看磁盘IO
iostat -x 1

 

使用场景举例:磁盘空间不足时,使用du -sh /*从根目录开始逐级排查,找到占用空间最大的目录或文件。日志目录、临时文件目录、缓存目录通常是磁盘空间的主要消耗者。

 

# 从根目录开始逐级排查
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 /tmp

# 查看用户目录
du -sh /home/*

# 统计特定用户使用的空间
du -sh /home/nginx

# 排除已删除但被进程打开的文件
du -h --exclude='proc' /proc

# 实时监控目录变化
watch -n 1 'du -sh /var'

 

2.5 iostat与vmstat

iostat是iostatistics的缩写,用于监控系统磁盘IO和CPU使用情况。iostat -xz 1每秒刷新一次详细统计,-x显示扩展统计,-z忽略没有活动的设备。

 

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

 

iostat输出的关键指标包括:%util设备利用率,接近100%时说明设备达到IO瓶颈;r/s和w/s每秒读写次数;rkB/s和wkB/s每秒读写数据量;await平均IO等待时间;avgqu-sz平均队列长度。

await和%util是两个最关键的指标。await高但%util不高,说明IO延迟大但设备本身未饱和,可能是存储网络延迟问题。%util高但await正常,说明设备本身是瓶颈。

vmstat(virtual memory statistics)用于查看虚拟内存统计信息。vmstat 1每秒刷新一次,-s显示详细统计表。

 

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

 

vmstat输出的关键列包括:r运行队列长度,表示等待CPU的进程数;b阻塞队列长度,表示等待IO的进程数;swpd虚拟内存使用量;free空闲内存;si/so换入换出内存量;us/sy/id CPU用户/系统/空闲比例。

 

# 每秒显示一次
vmstat 1

# 显示5次后退出
vmstat 1 5

# 显示详细统计
vmstat -s

# 显示内存统计(MB为单位)
vmstat -S m 1

# 显示磁盘统计
vmstat -d

# 显示每CPU核心统计
vmstat -p /dev/sda1

# 配合grep监控特定指标
vmstat 1 | grep -E 'r|wa'

 

使用场景举例:系统负载高但CPU空闲时,使用vmstat查看是否有大量进程在等待IO。使用iostat查看是哪个设备存在IO瓶颈。如果%util接近100%,说明设备处理能力不足,需要考虑升级存储或优化IO模式。

 

# 综合使用
iostat -xz 1 &
vmstat 1 &
pidstat -d 1

# 查看CPU和IO关系
iostat -x 1 5

# 监控特定设备
iostat -p sda 1

# 查看CPU频率
vmstat -s | grep -i cpu

# 监控上下文切换
vmstat 1 10

# 查看内存详情
vmstat -s -S m

# 监控系统负载
uptime
w

 

2.6 strace与ltrace

strace用于追踪进程的系统调用和信号,是排查程序行为和性能问题的有力工具。strace -f -p PID追踪指定进程及其子进程,-c统计各类系统调用次数和耗时。

 

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

 

strace的输出包含每行一个系统调用,显示调用号、函数名、参数和返回值。read(fd, buffer, count)显示读取操作,write(fd, buffer, count)显示写入操作,openat(pathname, flags)显示文件打开操作。

strace -T显示每个系统调用的耗时,-tt显示微秒级时间戳。耗时信息对于性能分析非常重要,长时间等待的系统调用往往是性能瓶颈。

 

# 追踪进程系统调用
strace -p 1234

# 追踪并显示返回值
strace -i -p 1234

# 统计系统调用次数
strace -c -p 1234

# 显示时间戳
strace -t -p 1234

# 显示微秒级时间
strace -tt -p 1234

# 显示每个调用耗时
strace -T -p 1234

# 追踪特定系统调用
strace -e trace=read,write,open,close -p 1234

# 追踪网络相关调用
strace -e trace=network -p 1234

# 追踪信号
strace -e trace=signal -p 1234

# 追踪子进程
strace -f -p 1234

# 输出到文件
strace -o /tmp/strace.log -p 1234

# 限制输出行数
strace -q -p 1234

# 显示系统调用号
strace -r -p 1234

 

ltrace用于追踪进程调用的库函数。使用ltrace -p PID追踪指定进程,-c统计库函数调用次数。ltrace主要追踪动态库函数调用,适合分析程序与库的交互。

 

# 追踪库函数调用
ltrace -p 1234

# 统计库函数调用次数
ltrace -c -p 1234

# 追踪特定库函数
ltrace -e malloc,free -p 1234

# 显示返回值
ltrace -i -p 1234

# 追踪子进程
ltrace -f -p 1234

# 输出到文件
ltrace -o /tmp/ltrace.log -p 1234

 

使用场景举例:程序卡住无响应时,使用strace -p PID查看进程正在执行的系统调用。如果显示connect或read阻塞,说明可能在等待网络通信或文件读取。如果某个系统调用反复返回-1,说明可能存在系统资源或权限问题。

 

# 分析nginx worker进程
strace -p $(pgrep -f "nginx: worker" | head -1) -c

# 分析进程正在做什么
strace -p 1234 2>&1 | head -50

# 追踪失败的调用
strace -e trace=open,openat -p 1234 2>&1 | grep -E "ENOENT|Permission"

# 追踪TCP连接
strace -e trace=socket,connect,accept -p 1234

# 分析文件操作
strace -e trace=open,read,write,close -p 1234

# 分析CPU密集型进程
strace -c -p 1234

# 追踪正在运行的命令
strace -f -o /tmp/trace.log 

# 分析动态库加载
ltrace -e dlopen -p 1234

 

2.7 tcpdump与Wireshark

tcpdump是命令行网络抓包工具,用于捕获和分析网络数据包。tcpdump -i eth0 -nn host 10.0.0.1捕获eth0网卡上与10.0.0.1通信的数据包,-nn不解析主机名和服务名。

 

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
1030.123456 IP 10.0.0.1.443 > 10.0.0.2.54321: Flags [P.], seq 12345:12356, ack 67890, win 502, length 11
1030.123789 IP 10.0.0.2.54321 > 10.0.0.1.443: Flags [.], ack 12356, win 502, length 0
1030.124012 IP 10.0.0.1.443 > 10.0.0.2.54321: Flags [P.], seq 12356:12367, ack 67890, win 502, length 11

 

tcpdump的输出格式是:时间戳 协议 源地址.端口 > 目标地址.端口 标志信息。TCP包的标志信息包括S(SYN)、F(FIN)、P(PUSH)、R(RST)。三次握手显示为S、S.、F。TCP连接终止显示为F.、.F。

tcpdump支持丰富的过滤表达式。tcpdump port 80 and tcp[13]&2!=0捕获所有TCP的SYN包(发起连接)。tcpdump tcp and greater 1000捕获大于1000字节的TCP包。

 

# 捕获特定接口
tcpdump -i eth0

# 捕获所有接口
tcpdump -i any

# 捕获特定主机
tcpdump host 10.0.0.1

# 捕获特定端口
tcpdump port 80

# 捕获特定协议
tcpdump icmp

# 捕获特定网络
tcpdump net 192.168.1.0/24

# 组合条件
tcpdump -i eth0 host 10.0.0.1 and port 80

# 不解析地址和端口
tcpdump -nn

# 显示完整数据包内容
tcpdump -X

# 显示ASCII内容
tcpdump -A

# 保存到文件
tcpdump -w /tmp/capture.pcap

# 读取抓包文件
tcpdump -r /tmp/capture.pcap

# 显示详细输出
tcpdump -v

# 显示更详细输出
tcpdump -vv

# 限制抓包数量
tcpdump -c 100

# 限制抓包大小
tcpdump -s 100

# 打印链路层头
tcpdump -e

 

Wireshark是图形化的网络协议分析工具,提供更强大的分析功能。Wireshark支持更丰富的协议解析,可以自动重组TCP流,提供统计和图表功能。

Wireshark常用过滤器:

 

# 显示过滤器
ip.addr == 10.0.0.1
tcp.port == 80
tcp.flags.syn == 1
tcp.flags.reset == 1
http.request.method == "GET"
dns.qry.name contains "example.com"

# 捕获过滤器
host 10.0.0.1
port 80
tcp[tcpflags] & (tcp-syn|tcp-fin) != 0

 

使用场景举例:服务连接超时排查。使用tcpdump -i any host target_ip and port target_port -w capture.pcap在问题发生时捕获数据包,然后在Wireshark中分析TCP三次握手是否正常,是否存在丢包或重传。

 

# 捕获HTTP请求
tcpdump -i any -A 'tcp port 80 andtcp[((tcp[12:1] & 0xf0) >> 2):2] = 0x474554'

# 捕获DNS查询
tcpdump -i any -A 'udp port 53'

# 捕获TCP重传
tcpdump -i any 'tcp[tcpflags] & (tcp-retrans) != 0'

# 捕获TCP连接建立
tcpdump -i any 'tcp[tcpflags] & (tcp-syn) != 0 andtcp[tcpflags] & (tcp-ack) == 0'

# 捕获SSL/TLS握手
tcpdump -i any 'tcp[((tcp[12:1] & 0xf0) >> 2):4] = 0x160301'

# 分析网络延迟
tcpdump -i any -tttt 'tcp port 80'

# 捕获ICMP
tcpdump -i any 'icmp'

# 捕获ARP
tcpdump -i any 'arp'

# 捕获VLAN标记
tcpdump -i any -vlan

 

2.8 find、awk与sed

find用于在目录树中查找文件,支持按文件名、类型、大小、时间等条件搜索。

 

# 基本查找
find /path -name "*.log"
find /path -type f
find /path -type d

# 按权限查找
find /path -perm 644
find /path -perm -u+x

# 按大小查找
find /path -size +100M
find /path -size -1G

# 按时间查找
find /path -mtime -7        # 7天内修改
find /path -atime +30       # 30天前访问
find /path -ctime 0         # 当天状态改变

# 按所有者查找
find /path -user nginx
find /path -group www-data

# 执行动作
find /path -name "*.tmp" -delete
find /path -name "*.log" -exec rm {} ;
find /path -name "*.log" -exec ls -lh {} ;

# 排除目录
find /path -path "*/proc" -prune -o -type f -print

# 查找空文件
find /path -type f -empty

# 查找符号链接
find /path -type l

# 查找最近修改的文件
find /path -mmin -60        # 60分钟内修改

# 查找并移动
find /path -name "*.bak" -exec mv {} /backup/ ;

# 查找并压缩
find /path -name "*.log" -exec gzip {} ;

 

awk是一种文本处理语言,适合处理结构化文本数据。

 

# 基本用法
awk '{print $1, $3}' file           # 打印第1和第3列
awk -F: '{print $1}' /etc/passwd    # 指定分隔符
awk '{print NF}' file                # 打印列数
awk '{print NR}' file                # 打印行号

# 条件过滤
awk '/pattern/ {print $0}' file     # 包含模式的行
awk '$3 > 100 {print $0}' file      # 第3列大于100
awk '$1 == "value" {print $0}' file # 第1列等于value

# 计算统计
awk '{sum+=$1} END {print sum}' file
awk '{sum+=$1; count++} END {print sum/count}' file
awk '{if($1>max) max=$1} END {print max}' file

# 多字段处理
awk -F: '{print $1, $NF}' /etc/passwd

# 字符串函数
awk '{print toupper($1)}' file
awk '{print length($1)}' file
awk '{print substr($1, 1, 5)}' file

# 格式化输出
awk '{printf "%-10s %10.2f
", $1, $2}' file

 

日志分析awk示例:

 

# Nginx访问日志分析
# 格式: $remote_addr - $remote_user [$time_local] "$request" $status $body_bytes_sent
awk '{print $1}' access.log | sort | uniq -c | sort -rn | head -20   # TOP 20 IP
awk '{print $9}' access.log | sort | uniq -c | sort -rn | head -10   # TOP 10 状态码
awk '{sum+=$10} END {print sum/1024/1024 " MB"}' access.log         # 总流量
awk '$9 >= 500 {count++} END {print count}' access.log              # 5xx错误数

# Apache日志分析
awk '{print $7}' access.log | sort | uniq -c | sort -rn | head -10  # TOP URL

# SSH登录日志分析
awk '/Failed password/ {print $11}' /var/log/secure | sort | uniq -c | sort -rn | head -10
awk '/Accepted/ {print $9, $11}' /var/log/secure

 

sed是一种流编辑器,用于对文本进行替换、删除、插入等操作。

 

# 基本替换
sed 's/old/new/' file              # 替换每行第一个
sed 's/old/new/g' file              # 替换所有
sed 's/old/new/2' file              # 替换每行第二个

# 原地编辑
sed -i 's/old/new/g' file           # 直接修改文件
sed -i.bak 's/old/new/g' file      # 修改并备份

# 多重替换
sed -e 's/a/b/' -e 's/c/d/' file

# 排除行
sed '/pattern/d' file               # 删除匹配行
sed '/pattern/!d' file              # 删除不匹配行

# 插入和追加
sed '1iheader' file                # 在第1行前插入
sed '1aline' file                  # 在第1行后追加
sed '/pattern/aline' file          # 在匹配行后追加

# 替换多行
sed '/start/,/end/s/old/new/g' file

# 使用正则
sed -r 's/regex/new/g' file
sed 's/.*prefix(.*)suffix.*/1/' file  # 捕获组

# 打印行
sed -n '10,20p' file                # 打印第10-20行
sed -n '/pattern/p' file            # 打印匹配行

# 替换tab为空格
sed 's/	/ /g' file

# 去除空格
sed 's/^[ 	]*//' file             # 行首
sed 's/[ 	]*$//' file             # 行尾
sed 's/[ 	]*//g' file             # 所有空格

 

使用场景举例:分析nginx访问日志统计IP访问量。

 

# 统计IP访问量
awk '{print $1}' access.log | sort | uniq -c | sort -rn | head -20

# 统计状态码分布
awk '{print $9}' access.log | sort | uniq -c | sort -rn

# 统计带宽使用
awk '{sum+=$10} END {print sum/1024/1024 " MB"}' access.log

# 统计5xx错误
awk '$9 ~ /^5/ {count++} END {print count}' access.log

# 统计访问最频繁的URL
awk '{print $7}' access.log | sort | uniq -c | sort -rn | head -10

# 统计每秒请求数
awk '{print $4}' access.log | cut -d: -f2,3,4 | sort | uniq -c | sort -rn | head -10

# 统计HTTP方法分布
awk '{print $6}' access.log | tr -d '"' | sort | uniq -c | sort -rn

# 实时分析日志
tail -f access.log | awk '{print $1}' | sort | uniq -c | sort -rn

# 查找异常IP
awk '{print $1}' access.log | sort | uniq -c | sort -rn | awk '$1 > 1000 {print $2}'

# 替换日志中的敏感信息
sed -i 's/password=[^&]*/password=REDACTED/g' app.log
sed -i 's/token=[^&]*/token=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 -avzi source/ dest/

# 增量同步(只传输变化的部分)
rsync -avz --delete source/ dest/

# 排除文件
rsync -avz --exclude='*.log'source/ dest/
rsync -avz --exclude-from='exclude.txt'source/ dest/

# 包含文件
rsync -avz --include='*.php' --include='*/' --exclude='*'source/ dest/

# 压缩传输
rsync -avz --compress source/ dest/

# 保留权限和时间戳
rsync -avz source/ dest/

# 显示进度
rsync -avz --progress source/ dest/

# 限制带宽
rsync -avz --bwlimit=1000 source/ dest/

# dry-run(模拟执行)
rsync -avzn source/ dest/

# 同步符号链接
rsync -avzL source/ dest/

# 保留硬链接
rsync -avzH source/ dest/

 

rsync的核心优势是增量同步。只传输源和目标之间差异的部分,通过快速检查文件大小和修改时间实现。

 

# 文件权限对应关系
# rsync参数 -p = --perms
# rsync参数 -o = --owner
# rsync参数 -g = --group
# rsync参数 -t = --times
# rsync参数 -D = --devices --specials

# 完整参数示例
rsync -avz --delete 
  --exclude='.git' 
  --exclude='node_modules' 
  --exclude='*.log' 
  --progress 
  --stats 
source/ user@host:/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

# 定时同步脚本
0 */6 * * * rsync -avz --delete /data/ backup@backup-server:/backup/

# 同步时排除特定目录
rsync -avz --exclude='cache' --exclude='tmp' /var/www/html/ /dest/

# 使用rsync daemon方式
rsync -avz /source/ rsync://user@host/module/

# 限速传输避免影响业务
rsync -avz --bwlimit=5000 /source/ /dest/

 

2.10 systemctl与service

systemctl是systemd系统的管理工具,是现代Linux发行版的标准服务管理命令。

 

# 服务管理
systemctl start nginx          # 启动服务
systemctl stop nginx          # 停止服务
systemctl restart nginx      # 重启服务
systemctl reload nginx       # 重新加载配置
systemctl status nginx        # 查看状态
systemctl enable nginx       # 开机自启
systemctl disable nginx      # 取消开机自启
systemctl daemon-reload      # 重载systemd配置

# 查看服务
systemctl list-units --type=service           # 列出所有服务
systemctl list-units --type=service --state=running
systemctl list-dependencies nginx              # 服务依赖关系

# 服务日志
journalctl -u nginx              # 服务日志
journalctl -u nginx -n 50       # 最近50行
journalctl -u nginx -f          # 实时跟踪
journalctl --since "1 hour ago"# 指定时间范围

# 服务配置
systemctl show nginx            # 显示服务配置
systemctl cat nginx             # 查看服务文件
systemctl edit nginx            # 编辑服务配置

 

service是较老的服务管理命令,兼容SysVinit脚本。

 

# 基本用法
service nginx start
service nginx stop
service nginx restart
service nginx status
service --status-all            # 列出所有服务

# 检查特定服务
service sshd status
service httpd configtest        # 检查配置语法

 

systemd服务文件示例:

 

[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

 

使用场景举例:服务故障排查。

 

# 查看服务状态
systemctl status nginx

# 查看详细日志
journalctl -u nginx -n 100 --no-pager

# 检查配置文件语法
nginx -t

# 测试服务启动
systemctl start nginx

# 查看服务是否监听端口
ss -tlnp | grep nginx

# 检查进程
ps aux | grep nginx

# 强制重启
systemctl force-reload nginx

# 屏蔽服务
systemctl mask nginx
systemctl unmask nginx

 

3. 命令组合实战场景

3.1 服务器负载高排查

服务器负载高是常见的运维问题,排查思路是逐步定位是CPU、IO还是内存问题。

第一步,使用top或vmstat 1查看系统负载和CPU使用情况。如果CPU的us和sy很高,说明是CPU密集型任务占用大量CPU资源。如果CPU的wa很高,说明是IO等待导致。

 

# 查看系统状态
top
vmstat 1 5

# 查看CPU使用情况
mpstat -P ALL 1

# 查看进程状态
ps aux --sort=-%cpu | head -10
ps aux --sort=-%mem | head -10

 

第二步,如果确定是CPU问题,使用top按CPU排序查看最消耗CPU的进程。如果Java进程CPU占用高,使用jstack获取线程堆栈,分析哪个线程占用CPU高。

 

# 获取Java进程PID
jps -l
ps aux | grep java

# 获取线程堆栈
jstack PID > threaddump.txt

# 获取CPU使用最高的线程
top -Hp PID

# 获取进程的CPU使用情况
pidstat -p PID 1 5

 

第三步,如果确定是IO问题,使用vmstat查看b列是否有进程在等待IO。使用iostat查看哪个设备的%util高。

 

# 查看IO等待
vmstat 1

# 查看各设备IO情况
iostat -xz 1

# 查看哪个进程在进行IO
iotop

# 查看具体IO操作
lsof +D /

 

第四步,确定问题进程后,分析问题原因。CPU高可能是死循环、大量计算、夜间批处理任务触发。IO高可能是大量日志写入、数据库写入、文件扫描。

3.2 网络连接问题排查

网络连接问题的表现可能是SSH连接不上、服务访问超时、连接数异常等。

第一步,使用ping测试网络连通性。ping不通可能的原因包括:网络配置错误、防火墙拦截、链路故障。

 

# 测试基本连通性
ping -c 4 8.8.8.8
ping -c 4 gateway

# 路由追踪
traceroute 8.8.8.8
mtr 8.8.8.8

# DNS测试
nslookup google.com
dig google.com

 

第二步,如果ping通但服务访问异常,使用netstat或ss查看连接状态。

 

# 查看连接统计
netstat -an | awk '/^tcp/ {print $6}' | sort | uniq -c
ss -s

# 查看监听端口
netstat -tlnp
ss -tlnp

# 查看特定连接状态
netstat -an | grep ESTABLISHED
ss -tan state established

 

第三步,使用tcpdump抓包分析。

 

# 抓取特定端口的包
tcpdump -i any port 80 -nn

# 抓取特定主机的包
tcpdump -i any host 10.0.0.1 -nn

# 保存到文件
tcpdump -i any port 80 -w capture.pcap

# 分析三次握手
tcpdump -i any host target_ip and port target_port -nn

 

第四步,检查防火墙规则。

 

# 查看iptables规则
iptables -L -n -v
iptables -L -n -v --line-numbers

# 查看端口监听
netstat -tlnp
ss -tlnp

# 检查防火墙状态
systemctl status firewalld
systemctl status iptables

 

3.3 磁盘空间问题排查

磁盘空间不足会导致服务异常、写入失败等问题。

第一步,使用df -h查看各文件系统的空间使用情况。

 

df -h
df -i

 

第二步,使用du -sh /*从根目录逐级排查,找出占用空间大的目录。

 

du -h --max-depth=1 /
du -sh /var/*
du -sh /home/*

 

第三步,定位到具体目录后,使用du -ah --max-depth=1排序,找出占用空间最大的文件或子目录。

 

du -ah /var | sort -rh | head -20
find /var -type f -exec du -h {} + | sort -rh | head -20

 

第四步,清理时注意区分日志文件和普通文件。日志文件可以使用日志轮转工具处理后删除旧日志。

 

# 查看大文件
find / -type f -size +100M -exec ls -lh {} ;

# 查看被删除但未释放的文件
lsof +L1

# 清理旧日志
find /var/log -name "*.gz" -mtime +30 -delete

# 清理缓存
yum clean all
apt-get clean

 

4. 命令选择决策树

4.1 按场景选择命令

遇到系统卡顿或响应慢时,首先使用top或vmstat 1查看系统整体状态。

 

# 系统整体状态
vmstat 1 5           # 查看CPU、内存、IO综合情况
top                   # 查看进程占用
htop                  # 更友好的界面

# 如果CPU使用率高
ps aux --sort=-%cpu | head   # 查找CPU占用高的进程
pidstat -p PID                # 分析特定进程

# 如果内存使用率高
ps aux --sort=-%mem | head   # 查找内存占用高的进程
free -h                       # 查看内存详情

# 如果IO等待高
iostat -xz 1                  # 查看IO情况
iotop                         # 查找IO占用高的进程

 

遇到网络连接异常时,使用netstat或ss查看连接状态。

 

# 连接统计
ss -s                    # 概要统计
netstat -an | awk '/^tcp/ {print $6}' | sort | uniq -c

# 监听端口
ss -tlnp                # TCP监听
ss -ulnp                # UDP监听

# 连接状态
ss -tan state established
ss -tan state time-wait

# 抓包分析
tcpdump -i any port XXXX -nn

 

遇到磁盘空间问题时,使用df和du配合排查。

 

# 快速定位
df -h                    # 文件系统使用率
df -i                    # inode使用率

# 逐级排查
du -h --max-depth=1 /   # 根目录一级目录
du -sh /var/*           # 特定目录

# 大文件查找
find / -type f -size +1G
find / -name "*.log" -exec du -h {} + | sort -rh | head

 

遇到进程异常时,使用ps和lsof分析。

 

# 进程列表
ps aux                  # 完整信息
ps -ef                  # 进程树
pstree                  # 进程树状图

# 进程详情
lsof -p PID             # 打开的文件
lsof -i                  # 网络连接
cat /proc/PID/status    # 进程状态

 

4.2 命令参数记忆技巧

top系列记住几个关键按键:P按CPU排序,M按内存排序,T按时间排序,1查看各CPU核心,k杀进程,q退出。

netstat记住常用组合:-anp显示所有连接(-a全部,-n数字形式,-p进程)。

find记住三个核心选项:-name按文件名,-type按类型,-exec执行命令。

awk记住两个核心概念:1第一列,NF列数。

5. 进阶命令与工具

5.1 性能监控工具链

除了基础命令,运维人员还应掌握一些进阶工具组成完整的监控工具链。

htop - 增强版的top,支持鼠标操作和进程树视图。

 

# 安装
apt-get install htop   # Debian/Ubuntu
yum install htop       # RHEL/CentOS

# 常用参数
htop                    # 启动
htop -u nginx          # 过滤用户
htop -d 5              # 刷新延迟
htop -p PID1,PID2      # 监控特定进程

 

iotop - 按进程显示磁盘IO使用情况。

 

# 安装
apt-get install iotop

# 常用参数
iotop                   # 实时IO
iotop -o                # 只显示有IO的进程
iotop -b                # 批量模式
iotop -n 3              # 刷新3次后退出

 

iftop - 按连接显示网络带宽使用情况。

 

# 安装
apt-get install iftop

# 常用参数
iftop -i eth0           # 指定接口
iftop -n                # 不解析主机名
iftop -N                # 不解析端口号
iftop -B                # 以字节显示

 

nethogs - 按进程显示网络带宽使用情况。

 

# 安装
apt-get install nethogs

# 常用参数
nethogs                 # 实时
nethogs eth0            # 指定接口
nethogs -d 2            # 刷新间隔

 

5.2 日志分析工具

goaccess - 实时Web日志分析器。

 

goaccess access.log -c    # 交互式配置
goaccess access.log -o report.html --log-format=COMBINED

 

lnav - 高级日志文件查看器。

 

lnav /var/log/syslog
lnav /var/log/nginx/*.log
lnav -i access.log

 

5.3 系统信息收集

dmidecode - 查看硬件信息。

 

dmidecode -t system        # 系统信息
dmidecode -t memory       # 内存信息
dmidecode -t processor    # CPU信息

 

lscpu - 查看CPU信息。

 

lscpu
lscpu -e                  # 扩展信息
lscpu -p                  # 格式化输出

 

lsblk - 查看块设备信息。

 

lsblk
lsblk -f                  # 文件系统信息
lsblk -a                  # 所有设备

 

5.4 故障排查实战流程

系统故障排查的标准化流程可以提高排查效率。

Phase 1:信息收集

 

# 收集系统基本信息
uname -a                           # 系统信息
uptime                             # 运行时间和负载
hostname                           # 主机名
cat /etc/os-release               # 操作系统版本

# 收集资源使用信息
df -h                             # 磁盘使用
free -h                           # 内存使用
top -bn1 | head -20             # CPU和进程

 

Phase 2:网络诊断

 

# 网络连通性
ping -c 4 8.8.8.8              # 外网连通性
traceroute 8.8.8.8             # 路由追踪
nslookup google.com               # DNS解析

# 端口和服务
netstat -tlnp                    # 监听端口
netstat -an | grep ESTABLISHED  # 已建立连接
ss -tunap                        # 详细连接信息

 

Phase 3:进程和服务

 

# 进程状态
ps aux | head -20               # 进程列表
ps -ef | grep nginx             # 查找特定进程
pstree -p                       # 进程树

# 服务状态
systemctl status nginx           # 服务状态
journalctl -u nginx -n 50       # 服务日志

 

Phase 4:日志分析

 

# 系统日志
tail -100 /var/log/syslog      # 系统日志
tail -100 /var/log/messages    # 消息日志

# 应用日志
tail -100 /var/log/nginx/error.log
tail -100 /var/log/mysql/error.log

 

Phase 5:资源分析

 

# CPU分析
vmstat 1 5                      # 虚拟内存统计
mpstat -P ALL 1                # CPU使用率

# IO分析
iostat -xz 1                   # IO统计
iotop                           # 按进程IO

# 内存分析
free -m                         # 内存使用
cat /proc/meminfo              # 详细内存信息

 

5.5 常见故障快速处理手册

服务器无法连接

 

# 1. 检查网络连通性
ping -c 4 

# 2. 检查端口连通性
nc -zv  22

# 3. 检查服务状态
systemctl status sshd

# 4. 检查防火墙
iptables -L -n
firewall-cmd --list-all

 

磁盘空间不足

 

# 1. 找到大文件
du -sh /* | sort -rh | head -10

# 2. 查找大日志文件
find /var -name "*.log" -size +100M

# 3. 清理旧日志
journalctl --vacuum-time=7d
find /var/log -name "*.gz" -mtime +30 -delete

# 4. 清理缓存
yum clean all
apt-get clean

 

服务无法启动

 

# 1. 检查配置文件语法
nginx -t
apache2ctl configtest
java -jar app.jar --dry-run

# 2. 检查端口占用
lsof -i :80
netstat -tlnp | grep :80

# 3. 检查权限
ls -la /var/log/app
chown -R app:app /var/log/app

# 4. 检查依赖
ldd /path/to/binary

 

CPU使用率过高

 

# 1. 找到高CPU进程
top -c
# 按P排序查看CPU占用

# 2. 分析线程
ps -p PID -L -o pcpu,pid,tid,time
jstack PID > threaddump.txt

# 3. 如果是Java进程
jps -l
jstack PID

# 4. 限制CPU使用
cpulimit -p PID -l 50

 

内存使用率过高

 

# 1. 找到高内存进程
top -c
# 按M排序查看内存占用

# 2. 分析内存使用
ps aux --sort=-%mem | head

# 3. 检查OOM
dmesg | grep -i oom
journalctl -k | grep -i oom

# 4. 调整策略
sysctl vm.swappiness=10

 

5.6 命令组合使用技巧

日志分析组合

 

# 统计错误类型
grep -i error app.log | awk '{print $5}' | sort | uniq -c | sort -rn

# 查找异常IP
awk '{print $1}' access.log | sort | uniq -c | sort -rn | head -20

# 分析响应时间
awk '{print $NF}' access.log | sort -n | tail -20

# 统计状态码分布
awk '{print $9}' access.log | sort | uniq -c | sort -rn

 

系统监控组合

 

# 综合监控脚本
#!/bin/bash
echo"=== System Info ==="
uptime
echo"=== CPU ==="
top -bn1 | head -5
echo"=== Memory ==="
free -h
echo"=== Disk ==="
df -h
echo"=== Network ==="
ss -tunap | wc -l
echo"=== Top Processes ==="
ps aux --sort=-%cpu | head -6

 

进程监控组合

 

# 监控特定进程
watch -n 1 'ps aux | grep process_name | grep -v grep'

# 监控文件描述符
lsof -p PID | wc -l

# 监控打开的文件
lsof -p PID -a -d txt,mem,fd

# 监控网络连接
watch -n 1 'netstat -an | grep :80 | wc -l'

 

5.7 自动化脚本示例

系统健康检查脚本

 

#!/bin/bash
# system_health_check.sh

LOG_FILE="/var/log/health_check.log"
EMAIL="admin@example.com"

log() {
    echo"[$(date '+%Y-%m-%d %H:%M:%S')] $1" | tee -a "$LOG_FILE"
}

check_cpu() {
    cpu_usage=$(top -bn1 | grep "Cpu(s)" | awk '{print $2}' | sed 's/%us,//')
    if (( $(echo"$cpu_usage > 80" | bc -l) )); then
        log"WARNING: CPU usage is high: $cpu_usage%"
        return 1
    fi
    log"OK: CPU usage is normal: $cpu_usage%"
    return 0
}

check_memory() {
    mem_usage=$(free | grep Mem | awk '{print ($3/$2) * 100}')
    if (( $(echo"$mem_usage > 85" | bc -l) )); then
        log"WARNING: Memory usage is high: $mem_usage%"
        return 1
    fi
    log"OK: Memory usage is normal: $mem_usage%"
    return 0
}

check_disk() {
    disk_usage=$(df -h / | tail -1 | awk '{print $5}' | sed 's/%//')
    if [ "$disk_usage" -gt 80 ]; then
        log"WARNING: Disk usage is high: $disk_usage%"
        return 1
    fi
    log"OK: Disk usage is normal: $disk_usage%"
    return 0
}

check_services() {
    for service in nginx mysql redis; do
        if systemctl is-active --quiet $service; then
            log"OK: $service is running"
        else
            log"ERROR: $service is not running"
            return 1
        fi
    done
    return 0
}

# Main
log"=== System Health Check Started ==="
check_cpu
check_memory
check_disk
check_services
log"=== System Health Check Completed ==="

 

日志备份清理脚本

 

#!/bin/bash
# log_backup_cleanup.sh

LOG_DIR="/var/log/myapp"
BACKUP_DIR="/backup/logs"
RETENTION_DAYS=30

# Create backup directory if not exists
mkdir -p "$BACKUP_DIR"

# Backup logs
timestamp=$(date +%Y%m%d_%H%M%S)
tar -czf "$BACKUP_DIR/logs_${timestamp}.tar.gz""$LOG_DIR"/*.log 2>/dev/null

# Clean old backups
find "$BACKUP_DIR" -name "logs_*.tar.gz" -mtime +$RETENTION_DAYS -delete

# Compress old logs
find "$LOG_DIR" -name "*.log" -mtime +7 -exec gzip {} ;

# Delete very old logs
find "$LOG_DIR" -name "*.log.gz" -mtime +90 -delete

echo"Log backup and cleanup completed at $(date)"

 

总结

系统命令是运维工程师的基本功。熟练掌握这10个核心命令,可以应对大部分日常运维场景和故障排查需求。

命令的学习需要注重实践。建议在测试环境中多练习,亲自运行命令查看输出,理解每个参数的含义。同时注意命令之间的组合使用,如find结合awk、grep结合netstat等。

除了本文介绍的10个命令,还有很多有用的命令值得学习。如htop、iotop、iftop等增强版工具,提供更直观的信息展示。掌握了基础命令后,可以逐步学习这些增强工具,进一步提升运维效率。

最后,命令只是工具,更重要的是理解系统原理和排查思路。同样的命令,在不同经验水平的工程师手中,发挥的作用可能完全不同。建议在掌握命令的同时,也要深入学习操作系统原理、网络协议等基础知识。

打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分