首页 / 新闻资讯 / 技术教程

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

2026-05-03分类:技术教程管理员

写 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,磁盘涨得快不快、内存是否持续走高,翻翻记录就有判断。脚本本身也纳入备份,机器重装时和其他配置一起恢复。运维新人从这份脚本起步,慢慢加告警、加服务状态检查,就是一个趁手工具箱的生长过程。

技术教程