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":静默检测服务运行状态。--quiet 参数确保输出干净,仅通过返回码判断。
systemctl start "$SERVICE":若服务停止,尝试启动。- 第二层
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
部署完成后,服务器将静默记录每一次新的登录行为,为我们构筑一道简单却强大的安全防线,无需人工持续巡检日志。
附:术语对照表
| 术语 | 中文含义 | 说明 |
|---|
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| log rotation / accumulation | | |
| | |