linux 自动化脚本聚焦日志清理、服务监控、批量部署、磁盘告警四类高频场景:自动压缩保留 nginx 旧日志、mysqladmin 检测 mysql 假死并重启、rsync 同步多机配置、awk 精准提取超阈值磁盘使用率发邮件。

Linux 自动化脚本是运维提效的核心手段,关键不在于写得多,而在于解决真实、高频、易出错的问题。下面几个脚本示例覆盖日志清理、服务监控、批量部署和磁盘告警四类典型场景,均经生产环境简化验证,可直接修改后使用。
自动清理 Nginx 旧日志(按天保留 + 压缩)
避免磁盘被 access.log 或 error.log 撑爆,尤其在流量突增时。脚本用 find 配合时间戳判断,比单纯按文件名匹配更可靠:
#!/bin/bash
LOG_DIR=”/var/log/nginx”
RETAIN_DAYS=7
# 压缩 7 天前的日志并删除原始文件
find “$LOG_DIR” -name “*.log” -mtime +$RETAIN_DAYS -exec gzip {} ;
# 彻底删除 30 天前的压缩包
find “$LOG_DIR” -name “*.log.gz” -mtime +30 -delete
# 可选:重载 nginx 让新日志生效(如使用 logrotate 则无需)
# nginx -s reload
建议放入 crontab 每日凌晨执行:
0 2 * * * /opt/scripts/clean-nginx-log.sh
检测 MySQL 是否存活并自动重启
仅靠 systemd 的 Restart=always 不够——进程还在但 mysqld 已假死(如连接数打满、锁表卡住)。此脚本用 mysqladmin ping 做真实连通性检查:
#!/bin/bash
DB_USER=”health_check”
DB_PASS=”secure_pass”
DB_HOST=”127.0.0.1″
DB_PORT=”3306″
if ! mysqladmin -h”$DB_HOST” -P”$DB_PORT” -u”$DB_USER” -p”$DB_PASS” ping &>/dev/null; then
echo “$(date): MySQL is down, restarting…” | logger -t mysql-monitor
systemctl restart mysqld
sleep 10
if systemctl is-active –quiet mysqld; then
echo “$(date): MySQL restarted successfully” | logger -t mysql-monitor
else
echo “$(date): MySQL restart failed!” | logger -t mysql-monitor
fi
fi
注意:需提前创建专用数据库用户,权限仅限 USAGE,避免暴露高权限账号。
一键同步多台服务器的配置文件
当要更新 /etc/nginx/conf.d/*.conf 到 10 台 Web 节点时,手动 scp 太慢且易漏。用 for 循环 +rsync 保证原子性:
#!/bin/bash
SERVICES=(“web01” “web02” “web03”)
CONF_SRC=”/opt/config/nginx/”
CONF_DST=”/etc/nginx/conf.d/”
for host in “${SERVICES[@]}”; do
echo “Syncing to $host…”
if rsync -avz –delete “$CONF_SRC” “$host:$CONF_DST”; then
ssh “$host” “nginx -t && nginx -s reload 2>&1”
else
echo “Failed to sync $host” | logger -t nginx-deploy
fi
done
安全提示:依赖 SSH 免密登录,生产环境建议用 ansible 替代,但小规模场景 rsync 足够轻量。
磁盘使用率超阈值发邮件告警
df 命令输出格式在不同系统有差异,直接 grep 可能误判。用 awk 精准提取挂载点和使用率,并排除 /dev/shm 等伪文件系统:
#!/bin/bash
THRESHOLD=85
EMAIL=”ops@company.com”
df -P | awk -v thresh=”$THRESHOLD” ‘$5+0 > thresh && $1 !~ /^tmpfs|devtmpfs|overlay/ {print $1, $5}’ | while read fs usage; do
echo “ALERT: $fs usage is ${usage%%}%” | mail -s “Disk Alert on $(hostname)” “$EMAIL”
done
关键细节:
• - P 参数确保 df 输出 POSIX 格式,列对齐稳定
• $5+ 0 强制转为数字,避免 % 符号干扰比较
• 排除 tmpfs 等内存文件系统,防止误报






























