适用场景:Linux系统日常运维、故障排查、自动化部署、性能调优、批量操作场景。
环境要求:RHEL/CentOS 7.9+或Ubuntu 18.04+,Bash 4.2+,建议掌握Vim/正则表达式基础。
1️⃣ 实施步骤
核心命令分类与应用场景
命令体系架构:
Linux运维核心命令体系
├─ 系统信息查看(uname/hostname/uptime/who)
├─ 进程管理(ps/top/htop/kill/systemctl)
├─ 文件操作(ls/find/grep/sed/awk)
├─ 磁盘管理(df/du/lsblk/fdisk/mount)
├─ 网络诊断(ping/telnet/netstat/ss/tcpdump)
├─ 性能分析(vmstat/iostat/sar/perf)
├─ 日志分析(tail/grep/awk/journalctl)
└─ 批量自动化(Shell脚本/Ansible/rsync)
数据流向示例(日志分析链路):
原始日志文件(/var/log/nginx/access.log)
↓ tail -f(实时追踪)
过滤关键字(grep “ERROR”)
↓ awk(提取字段)
统计分析(sort | uniq -c)
↓ 可视化
生成报告(mail/钉钉通知)
Step 1: 系统信息与资源监控命令
目标: 快速掌握系统状态,定位资源瓶颈
◆ 1.1 查看系统基本信息
# 1. 查看系统版本和内核
uname -a
# 预期输出:Linux hostname 4.18.0-425.el8.x86_64 #1 SMP x86_64 GNU/Linux
cat /etc/os-release
# 预期输出:
# NAME=“CentOS Stream”
# VERSION=“8”
# ID=“centos”
# 2. 查看系统运行时间和负载
uptime
# 预期输出:10:23:45 up 45 days, 12:34, 3 users, load average: 1.23, 1.45, 1.67
# 负载解读:
# - 1分钟负载:1.23(最近1分钟平均等待运行的进程数)
# - 5分钟负载:1.45
# - 15分钟负载:1.67
# - 规则:负载 < CPU核心数为正常(如4核CPU,负载<4.0)
# 3. 查看CPU信息
lscpu
# 关键字段:
# Architecture: x86_64
# CPU(s): 4
# Model name: Intel(R) Xeon(R) CPU E5-2680 v4 @ 2.40GHz
# 或使用grep提取核心数
grep -c ^processor /proc/cpuinfo
# 预期输出:4(4个CPU核心)
# 4. 查看内存使用(推荐使用free -h代替free)
free -h
# 预期输出:
# total used free shared buff/cache available
# Mem: 7.6Gi 2.3Gi 1.2Gi 12Mi 4.1Gi 5.0Gi
# Swap: 2.0Gi 0B 2.0Gi
# 关键指标:
# - available:实际可用内存(含可回收的cache)
# - buff/cache:页缓存和缓冲区(可释放)
# - 警戒线:available < 10%总内存时需关注
关键参数解释:
load average:CPU负载平均值,反映等待运行的进程数(不是CPU使用率)
buff/cache:内核用于加速I/O的缓存,内存不足时会自动释放
available:比free更准确,考虑了可回收的缓存
◆ 1.2 实时监控系统资源(top/htop)
# 1. top命令基础用法
top
# 交互式快捷键:
# - 1:显示每个CPU核心使用率
# - P:按CPU使用率排序(默认)
# - M:按内存使用率排序
# - c:显示完整命令行
# - k:杀死进程(输入PID)
# - q:退出
# 2. top常用参数
top -bn1 # 批处理模式,执行1次后退出(脚本中使用)
top -u nginx # 只显示指定用户的进程
top -p 12345,12346 # 只监控指定PID
# 3. 提取top输出的关键信息(脚本友好)
top -bn1 | head -20
# 输出解读:
# %Cpu(s): 12.5 us, 3.2 sy, 0.0 ni, 83.8 id, 0.5 wa, 0.0 hi, 0.3 si
# 字段含义:
# - us:用户态CPU时间(应用程序)
# - sy:内核态CPU时间(系统调用)
# - id:空闲时间(idle)
# - wa:等待I/O时间(高则说明磁盘慢)
# - hi:硬中断时间
# - si:软中断时间(网络密集型场景会高)
# 4. htop(更强大的top替代工具)
yum install -y htop # 或 apt install htop
htop
# 特点:
# - 彩色界面,更直观
# - 支持鼠标操作
# - 树形显示进程关系(F5切换)
# - 内置搜索(F3)和过滤(F4)
生产环境监控脚本:
#!/bin/bash
# 文件名:system_monitor.sh
# 用途:每5分钟采集系统资源,超阈值告警
CPU_THRESHOLD=80
MEM_THRESHOLD=90
DISK_THRESHOLD=85
ALERT_EMAIL=“ops@example.com”
# 获取CPU使用率(取1分钟平均值)
CPU_USAGE=$(top -bn1 | grep “Cpu(s)” | awk ‘{print 100-$8}’ | cut -d. -f1)
# 获取内存使用率
MEM_USAGE=$(free | grep Mem | awk ‘{printf(“%.0f”, $3/$2*100)}’)
# 获取根分区磁盘使用率
DISK_USAGE=$(df -h / | tail -1 | awk ‘{print $5}’ | tr -d ‘%’)
# 判断是否超过阈值
if [ “$CPU_USAGE” -gt “$CPU_THRESHOLD” ]; then
echo “CPU使用率过高: ${CPU_USAGE}%” | mail -s “告警: CPU” $ALERT_EMAIL
fi
if [ “$MEM_USAGE” -gt “$MEM_THRESHOLD” ]; then
echo “内存使用率过高: ${MEM_USAGE}%” | mail -s “告警: 内存” $ALERT_EMAIL
fi
if [ “$DISK_USAGE” -gt “$DISK_THRESHOLD” ]; then
echo “磁盘使用率过高: ${DISK_USAGE}%” | mail -s “告警: 磁盘” $ALERT_EMAIL
fi
# 记录日志
echo “$(date ‘+%Y-%m-%d %H:%M:%S’) CPU:${CPU_USAGE}% MEM:${MEM_USAGE}% DISK:${DISK_USAGE}%” >> /var/log/system_monitor.log
Crontab定时执行:
# 每5分钟执行一次
*/5 * * * * /usr/local/bin/system_monitor.sh
Step 2: 进程管理与服务控制
目标: 管理进程生命周期,排查进程异常
◆ 2.1 进程查看与过滤(ps)
# 1. 查看所有进程(标准格式)
ps aux
# 输出列解释:
# USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
# root 1234 0.5 2.3 456789 98765 ? Ss Jan15 2:34 /usr/sbin/nginx
# 关键字段:
# - %CPU:CPU使用率
# - %MEM:内存使用率
# - VSZ:虚拟内存大小(KB)
# - RSS:物理内存大小(KB)
# - STAT:进程状态(R=运行, S=睡眠, D=不可中断睡眠, Z=僵尸进程)
# 2. 按CPU使用率排序(找出CPU占用最高的进程)
ps aux --sort=-%cpu | head -10
# 3. 按内存使用率排序
ps aux --sort=-%mem | head -10
# 4. 查找特定进程(多种方法)
ps aux | grep nginx
pgrep -a nginx # 显示进程名和PID
pidof nginx # 仅显示PID
# 5. 查看进程树(父子关系)
ps auxf # 或使用 pstree
pstree -p 12345 # 显示指定PID的进程树
# 6. 查看进程打开的文件描述符
lsof -p 12345
# 或查看指定端口被哪个进程占用
lsof -i :80
# 预期输出:
# COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
# nginx 1234 root 6u IPv4 12345 0t0 TCP *:http (LISTEN)
关键参数解释:
ps aux:a=所有用户,u=用户友好格式,x=包括无终端进程
STAT列:S=可中断睡眠,D=不可中断睡眠(通常等待I/O),Z=僵尸进程(子进程退出但父进程未回收)
lsof:List Open Files,查看进程打开的文件/网络连接
◆ 2.2 进程终止与管理(kill)
# 1. 优雅终止进程(SIGTERM信号,进程可捕获并清理资源)
kill 12345
kill -15 12345 # 显式指定SIGTERM信号
# 2. 强制终止进程(SIGKILL信号,进程无法捕获)
kill -9 12345
# 注意:仅在SIGTERM无效时使用,可能导致资源泄漏
# 3. 终止进程组(所有同名进程)
pkill nginx
killall nginx
# 4. 根据条件批量终止进程
# 示例:终止所有占用内存>1GB的Java进程
ps aux | awk ‘$6>1000000 && $11~/java/ {print $2}’ | xargs kill -15
# 5. 重启进程(常用于重载配置)
systemctl reload nginx # 平滑重载(不中断连接)
systemctl restart nginx # 完全重启
# 6. 查看进程收到信号的历史
journalctl -u nginx | grep -i signal
常见信号说明:
| 信号 |
编号 |
说明 |
用途 |
| SIGTERM |
15 |
终止信号 |
优雅退出(默认kill命令) |
| SIGKILL |
9 |
强制终止 |
无法捕获,立即杀死 |
| SIGHUP |
1 |
挂起信号 |
通常用于重载配置 |
| SIGINT |
2 |
中断信号 |
Ctrl+C触发 |
| SIGSTOP |
19 |
暂停进程 |
无法捕获,暂停执行 |
◆ 2.3 服务管理(systemctl)
# 1. 查看服务状态
systemctl status nginx
# 输出关键信息:
# Active: active (running)(运行中)
# Main PID: 1234
# CGroup: /system.slice/nginx.service(进程控制组)
# 2. 启动/停止/重启服务
systemctl start nginx
systemctl stop nginx
systemctl restart nginx
systemctl reload nginx # 平滑重载配置
# 3. 设置开机自启
systemctl enable nginx
systemctl is-enabled nginx # 查询是否自启
# 4. 查看所有运行中的服务
systemctl list-units --type=service --state=running
# 5. 查看服务启动失败原因
systemctl status nginx -l # -l 显示完整日志
journalctl -xe -u nginx # 查看详细错误日志
# 6. 查看服务依赖关系
systemctl list-dependencies nginx
生产环境服务检查脚本:
#!/bin/bash
# 文件名:check_services.sh
# 用途:检查关键服务是否运行,异常时自动重启
SERVICES=“nginx mysqld redis”
for svc in $SERVICES; do
if ! systemctl is-active --quiet $svc; then
echo “[$(date)] $svc 未运行,尝试启动…” | tee -a /var/log/service_check.log
systemctl start $svc
# 等待5秒后验证
sleep 5
if systemctl is-active --quiet $svc; then
echo “[$(date)] $svc 启动成功” | tee -a /var/log/service_check.log
else
echo “[$(date)] $svc 启动失败,发送告警” | tee -a /var/log/service_check.log
# 这里添加告警逻辑(邮件/钉钉/短信)
fi
fi
done
Step 3: 文件查找与文本处理
目标: 快速定位文件,高效处理日志和配置文件
◆ 3.1 文件查找(find)
# 1. 按文件名查找(忽略大小写)
find /var/log -iname “*.log”
# 预期输出:列出所有.log文件
# 2. 按文件大小查找(大于100MB)
find /var -type f -size +100M
# 常用单位:k=KB, M=MB, G=GB
# 3. 按修改时间查找(最近7天修改的文件)
find /etc -type f -mtime -7
# -mtime -7:7天内修改
# -mtime +30:30天前修改
# -mmin -60:60分钟内修改
# 4. 按文件权限查找(查找777权限文件,安全隐患)
find /var/www -type f -perm 0777
# 5. 查找并删除(危险操作,谨慎使用)
find /tmp -type f -mtime +30 -name “*.tmp” -delete
# 或使用-exec执行命令
find /tmp -type f -mtime +30 -name “*.tmp” -exec rm -f {} \;
# 6. 查找并统计总大小
find /var/log -type f -name “*.log” -exec du -ch {} + | tail -1
# 预期输出:256M total
# 7. 排除特定目录(如排除node_modules)
find /data -path /data/node_modules -prune -o -name “*.js” -print
关键参数解释:
-type f:仅查找文件(d=目录,l=符号链接)
-size +100M:大于100MB(-100M=小于,100M=等于)
-exec {} \;:对每个文件执行命令,{}替换为文件名
◆ 3.2 文本搜索(grep)
# 1. 基础搜索(区分大小写)
grep “ERROR” /var/log/nginx/error.log
# 2. 忽略大小写
grep -i “error” /var/log/nginx/error.log
# 3. 显示行号
grep -n “ERROR” /var/log/nginx/error.log
# 输出:123:2024-01-15 10:23:45 [ERROR] Connection refused
# 4. 递归搜索目录
grep -r “password” /etc/
# 或只搜索特定文件类型
grep -r --include=“*.conf” “password” /etc/
# 5. 反向匹配(排除包含ERROR的行)
grep -v “ERROR” /var/log/app.log
# 6. 统计匹配行数
grep -c “ERROR” /var/log/app.log
# 预期输出:45(共45行包含ERROR)
# 7. 显示匹配行的前后文(上下3行)
grep -C 3 “ERROR” /var/log/app.log
# -A 3:显示后3行
# -B 3:显示前3行
# 8. 正则表达式搜索(查找IP地址)
grep -E ‘\b[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\b’ /var/log/nginx/access.log
# 9. 多条件搜索(OR逻辑)
grep -E “ERROR|WARN|FATAL” /var/log/app.log
# 10. 高亮显示匹配内容
grep --color=auto “ERROR” /var/log/app.log
◆ 3.3 文本处理三剑客(sed/awk)
sed(流编辑器):
# 1. 替换文本(仅输出,不修改原文件)
sed ‘s/old_text/new_text/’ file.txt
# s:替换命令
# 默认只替换每行第一个匹配
# 2. 全局替换(每行所有匹配)
sed ‘s/old_text/new_text/g’ file.txt
# 3. 直接修改原文件(危险操作,建议先备份)
sed -i ‘s/old_text/new_text/g’ file.txt
# -i:in-place修改
# 4. 删除特定行
sed ‘/pattern/d’ file.txt # 删除包含pattern的行
sed ‘3,5d’ file.txt # 删除第3-5行
# 5. 提取特定行
sed -n ‘10,20p’ file.txt # 打印第10-20行(-n抑制默认输出)
# 6. 批量修改配置文件(实战案例)
# 场景:修改Nginx监听端口从80改为8080
sed -i ‘s/listen 80;/listen 8080;/’ /etc/nginx/nginx.conf
awk(文本分析工具):
# 1. 打印特定列(默认空格/tab分隔)
awk ‘{print $1, $3}’ file.txt
# $1=第1列,$3=第3列,$0=整行
# 2. 指定分隔符(如冒号)
awk -F: ‘{print $1}’ /etc/passwd
# 打印所有用户名(第1列)
# 3. 条件过滤(打印第3列>100的行)
awk ‘$3>100 {print $0}’ file.txt
# 4. 统计计算(求第2列总和)
awk ‘{sum+=$2} END {print sum}’ file.txt
# 5. 实战案例1:分析Nginx访问日志(统计访问最多的IP)
awk ‘{print $1}’ /var/log/nginx/access.log | sort | uniq -c | sort -nr | head -10
# 流程:提取IP → 排序 → 去重计数 → 按次数倒序 → 取前10
# 6. 实战案例2:统计每个状态码的数量
awk ‘{print $9}’ /var/log/nginx/access.log | sort | uniq -c
# $9是Nginx日志的HTTP状态码列
# 7. 实战案例3:计算响应时间P95(假设响应时间在最后一列)
awk ‘{print $NF}’ access.log | sort -n | awk ‘BEGIN{c=0} {a[c++]=$1} END{print a[int(c*0.95)]}’
综合实战脚本:分析Nginx日志
#!/bin/bash
# 文件名:nginx_log_analyzer.sh
# 用途:分析Nginx访问日志,输出统计报告
LOG_FILE=“/var/log/nginx/access.log”
REPORT_FILE=“/tmp/nginx_report_$(date +%Y%m%d).txt”
echo “=== Nginx访问日志分析报告 ===” > $REPORT_FILE
echo “时间: $(date)” >> $REPORT_FILE
echo “” >> $REPORT_FILE
# 1. 总请求数
echo “总请求数:” >> $REPORT_FILE
wc -l < $LOG_FILE >> $REPORT_FILE
echo “” >> $REPORT_FILE
# 2. 独立IP数
echo “独立IP数:” >> $REPORT_FILE
awk ‘{print $1}’ $LOG_FILE | sort -u | wc -l >> $REPORT_FILE
echo “” >> $REPORT_FILE
# 3. 访问最多的前10个IP
echo “访问最多的10个IP:” >> $REPORT_FILE
awk ‘{print $1}’ $LOG_FILE | sort | uniq -c | sort -nr | head -10 >> $REPORT_FILE
echo “” >> $REPORT_FILE
# 4. 状态码分布
echo “HTTP状态码分布:” >> $REPORT_FILE
awk ‘{print $9}’ $LOG_FILE | sort | uniq -c | sort -nr >> $REPORT_FILE
echo “” >> $REPORT_FILE
# 5. 访问最多的10个URL
echo “访问最多的10个URL:” >> $REPORT_FILE
awk ‘{print $7}’ $LOG_FILE | sort | uniq -c | sort -nr | head -10 >> $REPORT_FILE
echo “报告已生成: $REPORT_FILE”
Step 4: 磁盘管理与存储优化
目标: 监控磁盘使用,排查磁盘空间问题
◆ 4.1 磁盘使用查看
# 1. 查看磁盘分区使用情况(推荐使用-h人类可读)
df -h
# 预期输出:
# Filesystem Size Used Avail Use% Mounted on
# /dev/sda1 50G 30G 18G 63% /
# /dev/sdb1 100G 45G 50G 48% /data
# 2. 查看inode使用情况(文件数过多时需关注)
df -i
# 预期输出:
# Filesystem Inodes IUsed IFree IUse% Mounted on
# /dev/sda1 3276800 456789 2820011 14% /
# 3. 查看特定目录大小
du -sh /var/log
# -s:汇总,-h:人类可读
# 预期输出:2.3G /var/log
# 4. 查看目录下各子目录大小(排查空间占用)
du -h --max-depth=1 /var | sort -hr
# 预期输出:
# 2.3G /var/log
# 1.5G /var/lib
# 500M /var/cache
# 5. 查找大文件(大于1GB)
find / -type f -size +1G -exec ls -lh {} \; 2>/dev/null
# 预期输出:列出所有>1GB的文件及其大小
# 6. 实时监控磁盘I/O(iostat)
yum install -y sysstat # 安装iostat
iostat -x 1
# 关键指标:
# %util:设备利用率(接近100%说明磁盘繁忙)
# await:平均I/O响应时间(毫秒)
# r/s, w/s:每秒读写次数
磁盘清理脚本(安全删除旧日志):
#!/bin/bash
# 文件名:disk_cleanup.sh
# 用途:清理30天前的日志文件,释放磁盘空间
LOG_DIRS=“/var/log/nginx /var/log/app”
RETENTION_DAYS=30
MIN_FREE_SPACE_GB=5 # 最小保留5GB空间
# 检查根分区剩余空间
FREE_SPACE=$(df / | tail -1 | awk ‘{print $4}’)
FREE_SPACE_GB=$((FREE_SPACE / 1024 / 1024))
if [ $FREE_SPACE_GB -lt $MIN_FREE_SPACE_GB ]; then
echo “[$(date)] 磁盘空间不足(剩余${FREE_SPACE_GB}GB),开始清理…”
for dir in $LOG_DIRS; do
if [ -d “$dir” ]; then
echo “清理目录: $dir”
# 查找并删除30天前的.log文件
find “$dir” -name “*.log” -type f -mtime +$RETENTION_DAYS -delete
# 压缩7-30天的日志
find “$dir” -name “*.log” -type f -mtime +7 -mtime -$RETENTION_DAYS -exec gzip {} \;
fi
done
echo “[$(date)] 清理完成,当前剩余空间: $(df -h / | tail -1 | awk ‘{print $4}’)”
else
echo “[$(date)] 磁盘空间充足(剩余${FREE_SPACE_GB}GB),无需清理”
fi
Crontab定时执行(每天凌晨2点):
0 2 * * * /usr/local/bin/disk_cleanup.sh >> /var/log/disk_cleanup.log 2>&1
Step 5: 网络诊断与抓包分析
目标: 排查网络连通性问题,分析网络流量
◆ 5.1 基础网络诊断
# 1. 测试网络连通性(ICMP)
ping -c 4 8.8.8.8
# -c 4:发送4个包后停止
# 预期输出:
# 4 packets transmitted, 4 received, 0% packet loss
# rtt min/avg/max/mdev = 10.123/12.456/15.789/2.345 ms
# 2. 测试端口连通性(TCP)
telnet 10.0.1.11 3306
# 或使用nc(netcat)
nc -zv 10.0.1.11 3306
# 预期输出:Connection to 10.0.1.11 3306 port [tcp/mysql] succeeded!
# 3. 追踪路由路径
traceroute 8.8.8.8
# 或使用mtr(持续追踪)
mtr -r -c 10 8.8.8.8
# 预期输出:显示到目标的每一跳延迟和丢包率
# 4. 查看网络连接状态
ss -tunlp
# -t:TCP,-u:UDP,-n:数字显示(不解析域名),-l:监听状态,-p:显示进程
# 预期输出:
# LISTEN 0 128 0.0.0.0:80 0.0.0.0:* users:((“nginx”,pid=1234,fd=6))
# 5. 统计网络连接数(按状态分组)
ss -ant | awk ‘{print $1}’ | sort | uniq -c
# 预期输出:
# 1 State
# 45 ESTAB(已建立连接)
# 12 TIME_WAIT(等待关闭)
# 3 LISTEN(监听状态)
# 6. 查看网络流量(实时)
yum install -y iftop
iftop -i eth0
# 或使用nethogs(按进程显示)
yum install -y nethogs
nethogs eth0
关键参数解释:
ss vs netstat:ss速度更快(直接读取内核数据),推荐使用ss
TIME_WAIT过多:短连接场景常见,可通过net.ipv4.tcp_tw_reuse=1复用
CLOSE_WAIT过多:应用程序未正确关闭连接(代码问题)
◆ 5.2 抓包分析(tcpdump)
# 1. 抓取所有包(危险,数据量大)
tcpdump -i eth0
# -i:指定网卡
# 2. 抓取特定端口的包(如HTTP 80端口)
tcpdump -i eth0 port 80
# 预期输出:实时显示80端口的数据包
# 3. 抓取特定主机的包
tcpdump -i eth0 host 10.0.1.11
# 4. 保存到文件(后续用Wireshark分析)
tcpdump -i eth0 -w /tmp/capture.pcap
# -w:写入文件
# 5. 只抓取TCP SYN包(分析连接建立)
tcpdump -i eth0 ‘tcp[tcpflags] & tcp-syn != 0’
# 6. 抓取HTTP请求(查看请求头)
tcpdump -i eth0 -A -s 0 ‘tcp port 80 and (((ip[2:2] - ((ip[0]&0xf)<<2)) - ((tcp[12]&0xf0)>>2)) != 0)’
# -A:以ASCII显示,-s 0:抓取完整包
# 7. 过滤并显示HTTP POST请求
tcpdump -i eth0 -A -s 0 ‘tcp port 80 and (tcp[((tcp[12:1] & 0xf0) >> 2):4] = 0x504f5354)’
# 8. 实战案例:抓取MySQL查询(3306端口)
tcpdump -i eth0 -l -s 0 -w - dst port 3306 | strings | grep SELECT
生产环境抓包脚本(限制大小和时间):
#!/bin/bash
# 文件名:network_capture.sh
# 用途:抓包分析(限制文件大小和时间,防止占满磁盘)
INTERFACE=“eth0”
OUTPUT_DIR=“/tmp/captures”
MAX_SIZE_MB=100 # 单个文件最大100MB
MAX_FILES=10 # 最多保留10个文件(总共1GB)
DURATION_SEC=300 # 抓包5分钟后自动停止
mkdir -p $OUTPUT_DIR
# 使用tcpdump的-C和-W参数实现循环抓包
tcpdump -i $INTERFACE -w $OUTPUT_DIR/capture.pcap \
-C $MAX_SIZE_MB \
-W $MAX_FILES \
-G $DURATION_SEC \
-Z root
# 参数说明:
# -C 100:单个文件达到100MB后切换到新文件
# -W 10:最多保留10个文件,超过则覆盖最旧的
# -G 300:每300秒(5分钟)切换一次文件
# -Z root:切换到root用户运行
2️⃣ 最小必要原理
Linux命令执行流程:
用户输入命令(如 ls -l)
↓
Shell解析(Bash/Zsh)
↓ 查找可执行文件($PATH)
系统调用(execve)
↓ 内核加载程序
内核执行
↓ 返回结果
标准输出(stdout)/标准错误(stderr)
管道与重定向:
| 符号 |
说明 |
示例 |
| |
管道(前一个命令的输出作为后一个命令的输入) |
ps aux | grep nginx |
> |
重定向输出(覆盖文件) |
echo “log” > file.txt |
>> |
重定向输出(追加到文件) |
echo “log” >> file.txt |
< |
重定向输入(从文件读取) |
mysql < backup.sql |
2> |
重定向错误输出 |
cmd 2> error.log |
&> |
重定向所有输出(stdout+stderr) |
cmd &> all.log |
Shell脚本调试技巧:
# 1. 启用调试模式(显示每条命令执行)
bash -x script.sh
# 或在脚本开头添加:set -x
# 2. 严格模式(遇到错误立即退出)
set -euo pipefail
# -e:遇到错误退出
# -u:使用未定义变量时报错
# -o pipefail:管道中任一命令失败则整体失败
# 3. 打印变量调试
echo “DEBUG: 变量值为 $VAR”
3️⃣ 可观测性
监控指标
系统性能监控脚本(集成多个命令):
#!/bin/bash
# 文件名:system_perf_snapshot.sh
# 用途:一键采集系统性能快照
OUTPUT_FILE=“/tmp/perf_snapshot_$(date +%Y%m%d_%H%M%S).txt”
{
echo “=== 系统性能快照 ===”
echo “时间: $(date)”
echo “”
echo “=== 系统负载 ===”
uptime
echo “”
echo “=== CPU使用率 ===”
top -bn1 | head -20
echo “”
echo “=== 内存使用 ===”
free -h
echo “”
echo “=== 磁盘使用 ===”
df -h
echo “”
echo “=== 磁盘I/O ===”
iostat -x 1 3
echo “”
echo “=== 网络连接数 ===”
ss -ant | awk ‘{print $1}’ | sort | uniq -c
echo “”
echo “=== Top 10进程(CPU) ===”
ps aux --sort=-%cpu | head -11
echo “”
echo “=== Top 10进程(内存) ===”
ps aux --sort=-%mem | head -11
} > $OUTPUT_FILE
echo “性能快照已保存: $OUTPUT_FILE”
4️⃣ 常见故障与排错
| 故障场景 |
诊断命令 |
解决方案 |
| CPU负载高 |
top -bn1 | head -20 → 找出占用CPU最高的进程 |
优化进程或限制CPU(cgroup) |
| 内存不足 |
free -h → 查看available内存 |
清理缓存:echo 3 > /proc/sys/vm/drop_caches |
| 磁盘空间满 |
df -h → 找到占用高的分区,du -sh /* → 找到大目录 |
删除旧日志或扩容磁盘 |
| 端口被占用 |
lsof -i :80 → 找出占用进程 |
kill进程或修改端口 |
| 服务无法启动 |
systemctl status nginx -l → 查看错误日志 |
根据日志修复配置或依赖 |
5️⃣ 变更与回滚剧本
配置文件变更模板:
#!/bin/bash
# 文件名:config_change.sh
# 用途:安全修改配置文件(自动备份+验证+回滚)
CONFIG_FILE=“/etc/nginx/nginx.conf”
BACKUP_DIR=“/opt/backup/nginx”
# 1. 备份原配置
mkdir -p $BACKUP_DIR
cp $CONFIG_FILE $BACKUP_DIR/nginx.conf.$(date +%Y%m%d_%H%M%S)
# 2. 修改配置
sed -i ‘s/listen 80;/listen 8080;/’ $CONFIG_FILE
# 3. 验证配置
if nginx -t; then
echo “配置验证成功,重载服务”
systemctl reload nginx
else
echo “配置验证失败,回滚到备份”
cp $BACKUP_DIR/nginx.conf.$(ls -t $BACKUP_DIR | head -1) $CONFIG_FILE
exit 1
fi
6️⃣ 最佳实践
-
使用别名提高效率
# ~/.bashrc中添加常用别名
alias ll=‘ls -lh’
alias df=‘df -h’
alias du=‘du -h’
alias tailf=‘tail -f’
alias psg=‘ps aux | grep’
-
命令行历史记录优化
# 增加历史记录数量
export HISTSIZE=10000
export HISTFILESIZE=20000
# 历史记录添加时间戳
export HISTTIMEFORMAT=“%Y-%m-%d %H:%M:%S ”
# 忽略重复命令
export HISTCONTROL=ignoredups
-
使用tmux管理会话(防止SSH断开)
# 安装tmux
yum install -y tmux
# 创建会话
tmux new -s mysession
# 分离会话(Ctrl+B然后按D)
# 重新连接
tmux attach -t mysession
7️⃣ FAQ
Q1: 如何提高命令行操作效率?
A: 1)使用Tab自动补全;2)学习常用快捷键(Ctrl+R搜索历史命令,Ctrl+A/E移动到行首/尾);3)使用别名;4)掌握管道和重定向。
Q2: 如何安全删除大文件?
A: 避免直接rm大文件(可能导致磁盘I/O飙升),使用:
# 先清空文件再删除
> large_file.log
rm large_file.log
Q3: 如何查看系统瓶颈在哪里?
A: 使用top快速判断:
- CPU高(
%Cpu(s)的us+sy高)→ CPU瓶颈
- 内存不足(
available低)→ 内存瓶颈
wa高(等待I/O时间)→ 磁盘瓶颈
Q4: Shell脚本如何处理参数?
A:
#!/bin/bash
# $1, $2, $3... 为位置参数
# $# 为参数个数
# $@ 为所有参数
if [ $# -lt 1 ]; then
echo “用法: $0 <参数1> [参数2]”
exit 1
fi
echo “第一个参数: $1”
8️⃣ 附录:关键脚本
脚本1:服务器巡检脚本
#!/bin/bash
##############################################################################
# 文件名:server_inspection.sh
# 用途:每日巡检脚本,生成服务器健康报告
##############################################################################
REPORT_FILE=“/tmp/inspection_$(date +%Y%m%d).txt”
{
echo “========== 服务器巡检报告 ==========”
echo “主机名: $(hostname)”
echo “时间: $(date)”
echo “”
echo “=== 1. 系统信息 ===”
uname -a
uptime
echo “”
echo “=== 2. CPU负载 ===”
top -bn1 | head -5
echo “”
echo “=== 3. 内存使用 ===”
free -h
echo “”
echo “=== 4. 磁盘使用(>80%告警) ===”
df -h | awk ‘NR==1 || $5+0>80 {print $0}’
echo “”
echo “=== 5. 服务状态 ===”
for svc in nginx mysqld redis; do
if systemctl is-active --quiet $svc; then
echo “$svc: 运行中”
else
echo “$svc: 未运行【告警】”
fi
done
echo “”
echo “=== 6. 网络连接数 ===”
ss -ant | awk ‘{print $1}’ | sort | uniq -c
echo “”
echo “=== 7. 最近登录记录 ===”
last -10
echo “”
echo “=== 8. 系统错误日志(最近10条) ===”
journalctl -p err -n 10 --no-pager
} > $REPORT_FILE
# 发送报告(邮件/钉钉)
mail -s “服务器巡检报告-$(hostname)” ops@example.com < $REPORT_FILE
echo “巡检完成,报告已生成: $REPORT_FILE”
脚本2:批量主机命令执行
#!/bin/bash
# 文件名:batch_exec.sh
# 用途:批量在多台主机执行命令
HOSTS_FILE=“hosts.txt” # 每行一个IP
COMMAND=“uptime”
if [ ! -f “$HOSTS_FILE” ]; then
echo “错误: $HOSTS_FILE 不存在”
exit 1
fi
while IFS= read -r host; do
echo “========== $host ==========”
ssh -o ConnectTimeout=5 root@$host “$COMMAND”
echo “”
done < “$HOSTS_FILE”
这些命令和脚本覆盖了Linux日常运维的绝大部分场景,熟练掌握后能极大提升工作效率。在实际工作中,你可以将这些脚本作为模板,根据具体的环境需求进行调整和扩展。更多的实战经验和脚本模板,欢迎在 云栈社区 的运维/DevOps板块交流分享。