Linux自动化脚本实战_运维脚本示例

1次阅读

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

Linux自动化脚本实战_运维脚本示例

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等内存文件系统,防止误报

text=ZqhQzanResources