ARTICLE DETAIL

资讯详情

深耕编程入门与网站建设的一线实战洞察。

运维 Shell 脚本实战:10 个高频场景脚本(附代码)

运维 Shell 脚本实战:10 个高频场景脚本(附代码) 摘要整理 10 个生产可用的运维 Shell 脚本:磁盘告警、日志清理、Nginx 日志统计、进程存活自动拉起、批量 SSH 并发执行、MySQL 备份保留、端口批量探测、系统信息采集、大日志按时间切割、定时任务防重复执行。每个脚本附完整代码与关键点说明。写脚本前的三板斧#!/bin/bashset-euopipefail# 遇错退出、未定义变量报错、管道任一环节失败即失败trapecho 清理临时文件; rm -f /tmp/$$.*EXIT# 异常也要清理现场养成习惯:所有脚本先写这两行,再写逻辑。90% 的脚本把线上搞坏都源于没有set -e。1. 磁盘使用率告警#!/bin/bashset-euopipefailTHRESHOLD85ALERT0whileread-rline;dousage$(echo$line|awk{print $5}|tr-d%)mount$(echo$line|awk{print $6})if[$usage-ge$THRESHOLD];thenecho[WARN]$mount使用率${usage}%ALERT1fidone(df-hP|tail-n2)[$ALERT-eq1]exit1||exit0关键点df -hP的-P保证一行一个挂载点(避免长设备名换行导致解析错位)退出码区分告警状态,方便接入监控平台(非 0 即告警)面试考点:为什么用-P?→ POSIX 输出格式,便于脚本解析。2. 清理 N 天前日志#!/bin/bashset-euopipefailLOG_DIR/var/log/appDAYS7DRY_RUN${1:---run}# 默认执行,传 --dry 只看不删find$LOG_DIR-typef-name*.log-mtime$DAYS-print0|whileIFSread-r-df;doif[$DRY_RUN--dry];thenecho[dry]$felserm-f--$fecho[del]$ffidone关键点-print0read -d :文件名含空格/换行也不出错支持 dry-run:先看再删,生产必备不要用rm -rf $DIR/*:变量为空时会删根目录(血案)面试考点:删了文件空间没释放?→ 文件被进程持有句柄,lsof | grep deleted,重启/重载进程或kill -USR1让其重开日志。3. Nginx 日志统计 TOP IP / 状态码#!/bin/bashset-euopipefailLOG$1echo TOP 10 来源 IP awk{print $1}$LOG|sort|uniq-c|sort-rn|head-10echo 状态码分布 awk{print $9}$LOG|sort|uniq-c|sort-rnecho TOP 10 慢请求 URL awk{print $NF, $7}$LOG|sort-rn|head-10关键点uniq -c前必须sort(uniq 只合并相邻行)sort -rn按数值倒序,-n不能省,否则 “10” 会排在 “9” 前面面试考点:统计 5xx 占比 →awk $9 ~ /^5/ | wc -l;按分钟统计 QPS → 用substr($4, 2, 17)截取时间做 key。4. 进程存活监控 自动拉起(带防重复)#!/bin/bashset-euopipefailAPPmyapp.jarLOG/var/log/app/myapp.logexec200/var/lock/myapp.lock flock-n200||{echo已有实例在跑,退出;exit0;}ifpgrep-f$APP/dev/null;thenecho进程存活exit0fiecho进程不在,拉起...nohupjava-jar$APP$LOG21echo已拉起 PID$!关键点flock -n:防止脚本被 cron 重复触发时并发执行(经典事故来源)pgrep -f匹配完整命令行;更严谨的做法是查 PID 文件生产建议用 systemd 的Restartalways,脚本只做兜底面试考点:为什么不用ps | grep判断?→ 会匹配到 grep 自身,且易受同名干扰。5. 批量 SSH 并发执行#!/bin/bashset-euopipefailHOSTS_FILE$1CMD${2:-uptime}CONCURRENCY10cat$HOSTS_FILE|xargs-P$CONCURRENCY-I{}bash-c host{} out$(timeout 8 ssh -o BatchModeyes -o ConnectTimeout3 -o StrictHostKeyCheckingno $host $CMD21)\echo[OK]$host:$out\||echo[FAIL]$host:$out关键点xargs -P控制并发度:太低慢,太高把跳板机打爆timeoutConnectTimeout:防止一台卡死拖住整批BatchModeyes:禁用交互提示(否则脚本会卡在密码输入)面试考点:批量执行的三大坑 → 单机卡死、并发过高、交互卡住,分别用 timeout / -P / BatchMode 解决。6. MySQL 备份 保留策略#!/bin/bashset-euopipefailDB$1DIR/backup/mysqlKEEP_DAYS14STAMP$(date%F_%H%M)mkdir-p$DIRmysqldump --single-transaction--quick--routines--triggers\-h127.0.0.1-ubackup -p$MYSQL_PWD$DB|gzip$DIR/${DB}_${STAMP}.sql.gzfind$DIR-name${DB}_*.sql.gz-mtime$KEEP_DAYS-deleteecho备份完成:$DIR/${DB}_${STAMP}.sql.gz关键点--single-transaction:InnoDB 一致性快照,不锁表密码用环境变量MYSQL_PWD,别写进命令行(会被ps看到)备份完必须验证:gzip -t校验 定期做恢复演练面试考点:备份三问 → 能不能恢复?多久能恢复?丢了最多丢多少数据?(RTO/RPO)7. 端口连通性批量探测#!/bin/bashset-euopipefailprobe(){localhost$1port$2iftimeout2bash-cecho /dev/tcp/$host/$port2/dev/null;thenecho[OPEN]$host:$portelseecho[CLOSE]$host:$portfi}whileIFS:read-rhostport;doprobe$host$portdonetargets.txtwait关键点/dev/tcp是 bash 内建,不需要装 nc/telnet后台并发 wait,比串行快得多目标文件格式:10.0.0.1:33068. 一键采集系统信息#!/bin/bashset-euopipefailecho 主机信息 hostname;uname-r;uptimeecho CPU TOP5 ps-eopcpu,pid,user,args--sort-pcpu|head-6echo 内存 free-mecho 磁盘 df-hP|grep-vtmpfsecho 连接数 ss-secho 最近登录 last-n5关键点:故障时第一时间跑这个脚本,信息先落盘( /tmp/diag_$(date %s).txt),别等现场被重启冲掉。9. 大日志按时间范围切割#!/bin/bashset-euopipefailSRC$1START$2# 如 2026-09-01 00:00END$3# 如 2026-09-02 00:00OUT${SRC}_${START///_}_${END///_}.logawk-vs$START-ve$END $0 s $0 e { print } $SRC$OUTwc-l$OUT关键点前提:日志每行以时间戳开头且格式统一(ISO 格式才可直接字符串比较)千万行大文件:用LC_ALLC加速字符串比较切完记得核对行数(别信感觉)10. 定时任务防重复执行#!/bin/bashset-euopipefailLOCK/var/lock/sync_data.lockexec200$LOCKif!flock-n200;thenecho$(date)上次任务未结束,本次跳过/var/log/sync_data.logexit0fiecho$(date)开始执行/var/log/sync_data.log# ... 业务逻辑echo$(date)执行完成/var/log/sync_data.log关键点任务执行时间 cron 间隔时,必然重叠 →flock是标准解法任务本身要幂等:跳过不代表不执行,重跑也不能有副作用记录开始/结束时间,方便算执行时长与排查卡住Shell 脚本 Checklist写完脚本自查这几条:有set -euo pipefail变量全部加引号:$VAR(空值时不会变成裸参数)危险操作支持 dry-run,或有确认有锁(防并发)、有超时(防卡死)关键步骤有日志、退出码能区分成败用 shellcheck 过一遍shellcheckmyscript.sh这些题我整理成了一个小程序上面这些题(以及更多)我整理成了一个小程序「系统运维面试题学习随手记」,295 道题按 8 个模块分类:中间件 · DevOps · SRE · 云原生 · Linux · AIOps · Shell · 综合开放题题库全部免费,不用登录,打开就能刷,每题都有参考答案(就是上面这种排查步骤 回答结构的形式)把简历和 JD 粘进去,会出 20 道针对你经历的押题,并给一份适配度分析(哪些 JD 要求你有对应经验、哪些要提前准备说法)还有录像练习:摄像头答题 → 回放 → 按要点自评,练表达(本地处理,不上传)微信搜索小程序「系统运维面试题学习随手记」题库持续更新,欢迎在评论区补充你被问过的题,我加进去。以上脚本场景在面试里也常被问到(“写个批量检查磁盘的脚本”“cron 任务重复执行怎么办”),我把这类题和参考答案一起整理进了自建的运维题库(295 题,8 个模块,免费刷)
返回列表