文档首页> 技术教程> 写一个最简单的服务器巡检脚本(bash 入门)

写一个最简单的服务器巡检脚本(bash 入门)

发布时间:2026-05-03 21:27        更新时间:2026-05-04 08:57
写 shell 脚本不必先系统学完 bash,从一个十几行的巡检脚本入手,变量、判断、循环恰好各用一次,够日常查磁盘、内存、负载三件事。 ## 第一步:搭骨架与变量 新建 check.sh,开头声明解释器并定义阈值变量: ``` #!/bin/bash DISK_WARN=85 MEM_WARN=90 DATE=$(date '+%F %T') echo "[$DATE] 巡检主机: $(hostname)" ``` 变量赋值等号两边不能有空格,命令替换用 $(),这是新手最常踩的两个坑。阈值抽成变量而不是写死在判断里,换一台机器只改开头两行就能复用。变量名全部大写是 shell 的惯例,一眼能和普通字符串区分。 ## 第二步:用循环遍历磁盘分区 ``` df -hP | grep -vE '^Filesystem|tmpfs|overlay' | while read line; do use=$(echo "$line" | awk '{print $5}' | tr -d '%') part=$(echo "$line" | awk '{print $6}') if [ "$use" -ge "$DISK_WARN" ]; then echo "[告警] 分区 $part 使用率 ${use}%" fi done ``` -P 保证 df 输出单行格式;read 逐行取值;use 去掉百分号后才能当数字比较。if 的方括号内侧必须留空格,数字比较用 -ge,字符串比较用 =,两类别混。初学阶段别省略引号,变量一律用引号包裹,能避开九成诡异问题。 ## 第三步:内存与负载各取一个数 ``` mem_use=$(free | awk '/Mem/{printf("%.0f", $3/$2*100)}') load1=$(awk '{print $1}' /proc/loadavg) echo "内存使用率: ${mem_use}% 1分钟负载: $load1" [ "$mem_use" -ge "$MEM_WARN" ] && echo "[告警] 内存超阈值" ``` 最后这种一行式写法等价于单个 if,判断简单时用它最紧凑。 ## 第四步:跑起来并定时 写完先做两步检查:bash -n check.sh 只查语法不执行;bash -x check.sh 逐行回显执行过程,变量值看得一清二楚,这两条不修改脚本文件,是调脚本最省力的组合。都没问题再 chmod +x check.sh 跑通,然后加进 crontab:*/30 * * * * /opt/scripts/check.sh >> /var/log/check.log。想再进一步,把告警的 echo 换成调用 mailx 发邮件,阈值分 warn、crit 两档做分级提醒,邮件通知要先确认机器的邮件出口可用,否则告警发不出去等于没告警。 巡检脚本贵在坚持出日志,不在花哨:每天一份 check.log,磁盘涨得快不快、内存是否持续走高,翻翻记录就有判断。脚本本身也纳入备份,机器重装时和其他配置一起恢复。运维新人从这份脚本起步,慢慢加告警、加服务状态检查,就是一个趁手工具箱的生长过程。