当前位置:首页>Linux>5 个实用的 Bash 脚本,实现 Linux 服务器日常运维监控任务自动化

5 个实用的 Bash 脚本,实现 Linux 服务器日常运维监控任务自动化

  • 2026-08-28 09:20:36
5 个实用的 Bash 脚本,实现 Linux 服务器日常运维监控任务自动化

1. 磁盘使用率监控脚本

本脚本遍历所有已挂载分区,当任一磁盘使用率超过 80% 时,自动发送邮件告警。

#!/bin/bash

THRESHOLD=80
EMAIL="admin@example.com"

df -hP | grep -vE '^Filesystem|tmpfs|devtmpfs|udev' | whileread -r line; do
  USAGE=$(echo"$line" | awk '{print $5}' | sed 's/%//')
  MOUNTPOINT=$(echo"$line" | awk '{print $6}')

if [ "$USAGE" -ge "$THRESHOLD" ]; then
echo"Warning: $MOUNTPOINT is at ${USAGE}% on $HOSTNAME" | \
      mail -s "Disk Alert: $HOSTNAME""$EMAIL"
fi
done

逐行原理剖析:

  • df -hP:以统一格式(每分区一行)输出所有已挂载文件系统的磁盘使用情况。
  • grep -vE '^Filesystem|tmpfs|devtmpfs|udev':过滤掉表头行及虚拟文件系统(不对应实际磁盘存储)。
  • awk '{print $5}':提取使用率百分比列。
  • sed 's/%//':去除百分号,以便进行数值比较。
  • [ "$USAGE" -ge "$THRESHOLD" ]:判断使用率是否大于等于 80%。
  • 若某分区突破阈值,脚本将发送邮件告警,明确指出受影响的挂载点。

定时任务配置:

为确保脚本定期执行(例如每 6 小时巡检一次),可通过 cron 排程:

0 */6 * * * /usr/local/bin/disk-monitor.sh

部署完成后,服务器将静默值守,在磁盘空间演变为严重故障前提前向我们发出预警。

2. 系统更新自动化脚本

本脚本实现更新全流程自动化:完整记录日志以供事后审计,并发送邮件摘要,让我们无需登录即可掌握变更概况。

脚本兼容 Ubuntu/Debian 系与 Rocky Linux/RHEL 系,仅包管理器命令略有差异。

Ubuntu/Debian 版本:

#!/bin/bash

LOGFILE="/var/log/sys-updates.log"
EMAIL="admin@example.com"

echo"=== Update started: $(date) ===" >> "$LOGFILE"
apt update >> "$LOGFILE" 2>&1
apt upgrade -y >> "$LOGFILE" 2>&1
apt autoremove -y >> "$LOGFILE" 2>&1
echo"=== Update finished: $(date) ===" >> "$LOGFILE"

tail -30 "$LOGFILE" | mail -s "Update Report: $HOSTNAME""$EMAIL"

RHEL/Rocky 版本:

#!/bin/bash

LOGFILE="/var/log/sys-updates.log"
EMAIL="admin@example.com"

echo"=== Update started: $(date) ===" >> "$LOGFILE"
dnf upgrade -y >> "$LOGFILE" 2>&1
dnf autoremove -y >> "$LOGFILE" 2>&1
echo"=== Update finished: $(date) ===" >> "$LOGFILE"

tail -30 "$LOGFILE" | mail -s "Update Report: $HOSTNAME""$EMAIL"

功能简析:

  • apt update / dnf upgrade:刷新软件包索引并安装可用更新。
  • >> "$LOGFILE" 2>&1:将标准输出与标准错误同时重定向至日志文件,确保无一遗漏。
  • autoremove:清理作为依赖引入但已不再使用的冗余包。
  • tail -30:仅截取日志末尾 30 行发送至邮箱,避免邮件内容冗长。

定时任务配置:

建议每日凌晨 2 点(系统低负载时段)自动执行:

0 2 * * * /usr/local/bin/auto-update.sh

前置依赖:

若邮件发送异常,需先安装邮件工具:

sudo apt install mailutils   # Ubuntu/Debian
sudo dnf install mailx       # RHEL/Rocky

部署完成后,服务器将自动保持补丁更新,而我们每天只需查阅一封简短的汇总邮件,无需再手动逐台维护。

3. 服务健康状态巡检脚本

在任何 Linux 服务器上,服务崩溃只是时间问题,无论是 Apache、MySQL、SSH,还是业务关键进程。真正的风险并非崩溃本身,而是故障持续多久才会被我们察觉。

本脚本持续监控核心服务状态:若检测到服务异常停止,立即尝试自动拉起,并同步发送告警,让我们精准掌握故障与恢复全过程。

#!/bin/bash

SERVICES=("apache2""mysql""ssh")
EMAIL="admin@example.com"

for SERVICE in"${SERVICES[@]}"; do
if ! systemctl is-active --quiet "$SERVICE"; then
    systemctl start "$SERVICE"
    STATUS=$?
if [ $STATUS -eq 0 ]; then
echo"$SERVICE was down and has been restarted on $HOSTNAME" | \
        mail -s "Service Restarted: $SERVICE on $HOSTNAME""$EMAIL"
else
echo"$SERVICE failed to restart on $HOSTNAME. Manual intervention needed." | \
        mail -s "Service FAILED to Restart: $SERVICE on $HOSTNAME""$EMAIL"
fi
fi
done

工作原理详解:

  • systemctl is-active --quiet "$SERVICE":静默检测服务运行状态。
    • 返回码 0 表示服务正常运行;
    • 非零返回码表示服务已停止。
    • --quiet 参数确保输出干净,仅通过返回码判断。
  • systemctl start "$SERVICE":若服务停止,尝试启动。
  • $?:捕获启动命令的返回码,判断重启是否成功。
  • 第一层 if:检测服务故障。
  • 第二层 if:判断重启结果,并发送对应级别的告警邮件。

平台差异说明:

在 RHEL 系发行版中,Apache 服务名称为 httpd,因此服务列表应调整为:

SERVICES=("httpd""mysql""ssh")

定时任务配置:

为快速发现问题,建议每 5 分钟巡检一次:

*/5 * * * * /usr/local/bin/service-checker.sh

部署完成后,服务器将具备基础的自愈能力:服务异常时自动恢复,同时向我们推送事件通知。

4. 关键数据备份脚本

备份是每位 Linux 管理员都知道应该做,却常常拖到事故后才追悔莫及。

本脚本助你规避此类风险:自动压缩备份关键目录,执行完整性校验,发送状态邮件,并自动清理过期备份,防止存储空间被历史文件慢慢蚕食。

#!/bin/bash

BACKUP_DIR="/backup"
SOURCE_DIRS="/etc /var/www /home"
DATE=$(date +%F)
BACKUP_FILE="$BACKUP_DIR/backup-$DATE.tar.gz"
EMAIL="admin@example.com"
RETENTION_DAYS=7

mkdir -p "$BACKUP_DIR"

tar -czf "$BACKUP_FILE"$SOURCE_DIRS 2>/dev/null
EXIT_CODE=$?

if [ $EXIT_CODE -eq 0 ]; then
  SIZE=$(du -sh "$BACKUP_FILE" | awk '{print $1}')
echo"Backup completed: $BACKUP_FILE ($SIZE)" | \
    mail -s "Backup Success: $HOSTNAME""$EMAIL"
else
echo"Backup FAILED on $HOSTNAME. Exit code: $EXIT_CODE" | \
    mail -s "Backup FAILED: $HOSTNAME""$EMAIL"
fi

find "$BACKUP_DIR" -name "backup-*.tar.gz" -mtime +$RETENTION_DAYS -delete

功能简析:

  • mkdir -p "$BACKUP_DIR":若备份目录不存在则自动创建。
  • tar -czf:将关键目录打包压缩为单个 .tar.gz 归档。
  • 2>/dev/null:屏蔽无害的系统文件警告(如 /proc 下的特殊文件)。
  • EXIT_CODE=$?:捕获归档命令返回码,判断备份是否成功。
  • du -sh:显示备份文件最终大小,便于快速验证数据量是否正常。
  • find ... -mtime +$RETENTION_DAYS -delete:删除超过 7 天的历史备份,释放存储空间。

定时任务配置:

建议每日凌晨 1 点(系统低峰期)执行:

0 1 * * * /usr/local/bin/backup.sh

部署完成后,系统将在后台静默完成数据保护,始终保留一份可用的近期副本,以应对突发故障。

5. 用户登录监控脚本

在生产级 Linux 服务器上,掌握登录动态与掌握服务运行状态同等重要。尤其是 SSH 访问,异常登录往往是配置失误甚至安全入侵的早期信号。

本脚本追踪新增登录会话,仅在检测到新登录事件时发送邮件,无需我们时刻盯守日志。

Ubuntu 通常将认证日志写入 /var/log/auth.log,可直接监控该文件。

Ubuntu/Debian 版本:

#!/bin/bash

LOGFILE="/var/log/auth.log"
LAST_RUN_FILE="/tmp/login_monitor_last_run"
EMAIL="admin@example.com"
NOW=$(date +%s)

if [ ! -f "$LAST_RUN_FILE" ]; then
  date -d '5 minutes ago' +%s > "$LAST_RUN_FILE"
fi

LAST_RUN=$(cat "$LAST_RUN_FILE")

LOGINS=$(awk '/session opened for user/ {
  cmd = "date -d \""$1" "$2" "$3" $(date +%Y)\" +%s 2>/dev/null"
  cmd | getline t
  close(cmd)
  if (t+0 >= '
"$LAST_RUN"'+0 && t+0 <= '"$NOW"'+0) print $0 }'"$LOGFILE")

if [ -n "$LOGINS" ]; then
echo"$LOGINS" | mail -s "Login Activity: $HOSTNAME""$EMAIL"
fi

echo"$NOW" > "$LAST_RUN_FILE"

RHEL/Rocky 版本:

RHEL 系采用 systemd-journald 管理日志,因此通过 journalctl 查询:

#!/bin/bash

LAST_RUN_FILE="/tmp/login_monitor_last_run"
EMAIL="admin@example.com"
NOW=$(date +%s)

if [ ! -f "$LAST_RUN_FILE" ]; then
  date -d '5 minutes ago' +%s > "$LAST_RUN_FILE"
fi

LAST_RUN=$(cat "$LAST_RUN_FILE")
SINCE=$(date -d @"$LAST_RUN"'+%Y-%m-%d %H:%M:%S')

LOGINS=$(journalctl _SYSTEMD_UNIT=sshd.service --since "$SINCE" --no-pager | \
  grep "session opened for user")

if [ -n "$LOGINS" ]; then
echo"$LOGINS" | mail -s "Login Activity: $HOSTNAME""$EMAIL"
fi

echo"$NOW" > "$LAST_RUN_FILE"

工作原理详解:

  • LAST_RUN_FILE:记录脚本上次运行的时间戳,确保仅检查增量登录事件。
  • session opened for user:用户成功登录时系统生成的标准日志关键词。
  • journalctl _SYSTEMD_UNIT=sshd.service:针对采用 systemd 日志的系统,直接读取 SSH 守护进程产生的登录事件。
  • if [ -n "$LOGINS" ]:仅在存在实际登录活动时触发邮件,避免无效打扰。

定时任务配置:

为实现近实时感知,建议每 5 分钟执行一次:

*/5 * * * * /usr/local/bin/login-monitor.sh

部署完成后,服务器将静默记录每一次新的登录行为,为我们构筑一道简单却强大的安全防线,无需人工持续巡检日志。

附:术语对照表

术语中文含义说明
mount point
挂载点
Linux 文件系统标准术语
partition
分区
磁盘分区
filesystem
文件系统
泛指文件系统或具体分区
cron
cron / 定时任务
保留原文或译为定时任务,视语境而定
systemd
systemd
系统与服务管理器,保留原文
journalctl
journalctl
systemd 日志查看工具,保留命令原名
autoremove
自动清理冗余包
特指包管理器的依赖清理
threshold
阈值
监控告警临界值
retention days
保留天数
数据留存策略
exit code / return code
返回码
命令执行状态码
self-healing
自愈
系统自动恢复能力
log rotation / accumulation
日志轮转 / 堆积
原文"grow"译为膨胀或堆积
manual intervention
人工介入
需管理员手动处理

最新文章

随机文章