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,避免暴露高权限账号。
AutoIt v3 版本, 这是一个使用类似 BASIC 脚本语言的免费软件, 它设计用于 Windows GUI(图形用户界面)中进行自动化操作. 利用模拟键盘按键, 鼠标移动和窗口/控件的组合来实现自动化任务. 而这是其它语言不可能做到或无可靠方法实现的(比如VBScript和SendKeys). AutoIt 非常小巧, 完全运行在所有windows操作系统上.(thesnow注:现在已经不再支持win 9x,微软连XP都能放弃, 何况一个win 9x支持), 并且不需要任何运行库. AutoIt
一键同步多台服务器的配置文件
当要更新/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等内存文件系统,防止误报









