运维自动化脚本 5 件套 — 健康巡检/日志告警/MySQL备份/批量执行/服务守护
来源:四海风闻 | 2026-05-17
5 个即用型运维自动化脚本,覆盖服务器健康巡检、日志异常告警、MySQL 自动备份、批量命令执行和服务守护,可独立部署到生产环境。
脚本 1:服务器健康巡检一键生成报告
#!/bin/bash
# health_check.sh - 服务器健康巡检脚本
echo "=== 服务器健康巡检报告 ==="
echo "时间: $(date '+%Y-%m-%d %H:%M:%S')"
echo "主机: $(hostname)"
cpu_usage=$(top -bn1 | grep "Cpu(s)" | awk '{print $2}' | cut -d'%' -f1)
echo "CPU使用率: ${cpu_usage}%"
mem_info=$(free -m | grep "Mem:")
mem_total=$(echo $mem_info | awk '{print $2}')
mem_used=$(echo $mem_info | awk '{print $3}')
mem_percent=$((mem_used * 100 / mem_total))
echo "内存使用: ${mem_used}MB / ${mem_total}MB (${mem_percent}%)"
df -h | grep -E "^/dev" | awk '{print $1, $5, $6}'
for svc in nginx mysql redis; do
if systemctl is-active --quiet $svc; then echo "✓ $svc"; else echo "✗ $svc"; fi
done
应用场景: 每天早上 8 点 cron 执行,产出报告推送至钉钉群。替代手动 SSH 巡检(1 小时 → 10 秒)。
参见 server-performance-four-dimensions — 全面的五维性能排查方法论和告警阈值
脚本 2:日志异常自动告警
#!/bin/bash
LOG_FILE="/var/log/nginx/error.log"
ALERT_WEBHOOK="https://oapi.dingtalk.com/robot/send?access_token=***"
KEYWORDS="error|exception|timeout|failed"
errors=$(tail -n 1000 "$LOG_FILE" | grep -iE "$KEYWORDS" | tail -n 10)
if [ -n "$errors" ]; then
curl -s -X POST "$ALERT_WEBHOOK" -H 'Content-Type: application/json' \
-d '{"msgtype":"text","text":{"content":"⚠️ 日志异常告警\n主机: '$(hostname)'\n'"$errors"'"}}'
fi
配合 */5 * * * * /opt/scripts/log_alert.sh 每 5 分钟执行一次。
参见 nginx-502-504-connection-reset-guide — Nginx 错误日志深度排查
脚本 3:自动备份 MySQL 数据库
#!/bin/bash
BACKUP_DIR="/data/backup/mysql"
DATE=$(date +%Y%m%d_%H%M%S)
DB_USER="backup_user"
DB_PASS="your_password"
DATABASES="user_db order_db product_db"
mkdir -p "$BACKUP_DIR"
for db in $DATABASES; do
mysqldump -u"$DB_USER" -p"$DB_PASS" "$db" | gzip > "$BACKUP_DIR/${db}_${DATE}.sql.gz"
done
find "$BACKUP_DIR" -name "*.sql.gz" -mtime +7 -delete
要点: 每天凌晨 2 点执行,保留 7 天备份。
参见 mysql-performance-config — MySQL 性能调优与配置
脚本 4:批量服务器命令执行
#!/usr/bin/env python3
import paramiko, concurrent.futures
servers = [
{"host": "192.168.1.10", "user": "root", "key": "/root/.ssh/id_rsa"},
{"host": "192.168.1.11", "user": "root", "key": "/root/.ssh/id_rsa"},
]
def run_command(server, cmd):
ssh = paramiko.SSHClient()
ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
ssh.connect(server["host"], username=server["user"], key_filename=server["key"])
stdin, stdout, stderr = ssh.exec_command(cmd)
return server["host"], stdout.read().decode()
def batch_execute(command):
with concurrent.futures.ThreadPoolExecutor(max_workers=10) as executor:
futures = [executor.submit(run_command, s, command) for s in servers]
for future in concurrent.futures.as_completed(futures):
host, output = future.result()
print(f"[{host}]\n{output}")
if __name__ == "__main__":
batch_execute("uptime && free -h")
优势: 并行批量执行,替代逐个 SSH 登录。
脚本 5:服务自动重启守护
#!/bin/bash
SERVICES="nginx php-fpm mysql"
WEBHOOK="https://oapi.dingtalk.com/robot/send?access_token=***"
for svc in $SERVICES; do
if ! systemctl is-active --quiet "$svc"; then
echo "$(date) - $svc 已停止,正在重启..."
systemctl restart "$svc"
if systemctl is-active --quiet "$svc"; then
curl -s -X POST "$WEBHOOK" -H 'Content-Type: application/json' \
-d '{"text":{"content":"✅ '"$svc"' 重启成功"}}'
else
curl -s -X POST "$WEBHOOK" -H 'Content-Type: application/json' \
-d '{"text":{"content":"❌ '"$svc"' 重启失败,请人工介入"}}'
fi
fi
done
配合 * * * * * /opt/scripts/service_guard.sh 每分钟检查一次。
综合建议
- 从最痛的点开始(巡检或备份),跑起来再迭代
- 所有脚本配合钉钉/飞书机器人通知,实现告警闭环
- 配合 online-troubleshooting-checklist 使用,覆盖日常运维+应急排障
关联页面
| 页面 | 关联点 |
|---|---|
| server-performance-four-dimensions | 五维排查框架 + 告警阈值(脚本 1 健康巡检的深度参考) |
| online-troubleshooting-checklist | 四维排查速查(自动化脚本 + 应急排障互补) |
| mysql-performance-config | MySQL 性能调优(脚本 3 备份的上下文) |
| nginx-502-504-connection-reset-guide | Nginx 错误日志深度排查(脚本 2 日志告警的上下文) |
| linux-server-load-case-study | 服务器负载排查案例(脚本 1 巡检的实战延伸) |
| terraform-production-guide | Terraform IaC 实战(自动化脚本 + IaC 互补:脚本 vs 声明式基础设施) |
| nginx-log-analysis-monitoring-guide | Nginx 日志分析与监控体系构建指南 — 自定义日志格式、性能分析技巧、GoAccess 可视化、 |
| linux-batch-rename-guide | Linux 批量重命名指南 — rename/prename 8 大场景实战(替换字符/改后缀/加前 |
| fullstack-performance-troubleshooting | 全栈性能排障入口(脚本 1-5 的排障背景) |