实用脚本能批量重启吗?

wen 实用脚本 11

本文目录导读:

实用脚本能批量重启吗?

  1. 批量重启远程服务器(通过 SSH)
  2. 批量重启本地机器上的多个服务(systemd)
  3. 批量重启 Docker 容器
  4. 更极致的:并行 + 健康检查 + 日志(高级版)
  5. ⚠️ 重要安全建议

当然可以!实用脚本完全可以批量重启服务、服务器、容器或应用,关键在于明确你的“重启”对象是什么(是远程服务器、Docker容器、还是同一台机器上的多个服务?)。

以下针对最常见的三种场景提供实用脚本(基于 Linux/Bash):

批量重启远程服务器(通过 SSH)

场景:你有 10 台 Web 服务器(ip.txt 中列出),需要依次重启它们。
核心注意点:避免同时重启导致业务全挂,建议串行执行。

#!/bin/bash
# 文件名: batch_reboot_remote.sh
# 服务器列表文件(每行一个 IP 或主机名)
SERVER_LIST="ip.txt"
# SSH 用户名
USER="root"
# SSH 私钥路径(建议使用密钥,避免交互输入密码)
KEY_PATH="/home/youruser/.ssh/id_rsa"
echo "开始批量重启远程服务器..."
# 逐台服务器执行重启命令
while IFS= read -r server; do
    echo "正在重启: $server"
    # 使用 timeout 防止 SSH 挂住(重启后连接会断开,脚本正常返回)
    timeout 30 ssh -i "$KEY_PATH" -o StrictHostKeyChecking=no "$USER@$server" \
        "sudo reboot" 2>&1
    if [ $? -eq 124 ]; then
        echo "  ✓ $server 重启命令已发送(连接正常断开)"
    else
        echo "  ✗ $server 重启失败,请检查网络或权限"
    fi
    # 等待 10 秒再操作下一台,避免雪崩
    sleep 10
done < "$SERVER_LIST"
echo "批量重启命令执行完毕!"

ip.txt 示例:
168.1.10
168.1.11
db-server.example.com

批量重启本地机器上的多个服务(systemd)

场景:你需要重启 Nginx、MySQL、Redis 等多个服务。
优势:完全串行,可精确控制顺序和状态。

#!/bin/bash
# 文件名: batch_restart_services.sh
# 服务列表(按依赖顺序排列)
SERVICES=("mysql" "redis" "nginx" "php-fpm")
echo "开始批量重启服务..."
for svc in "${SERVICES[@]}"; do
    echo -n "正在重启 $svc ... "
    sudo systemctl restart "$svc" 2>/dev/null
    if sudo systemctl is-active --quiet "$svc"; then
        echo "✓ 成功"
    else
        echo "✗ 失败!请检查 journalctl -u $svc"
    fi
    # 给服务启动留出缓冲时间
    sleep 3
done
echo "所有服务重启完成。"

批量重启 Docker 容器

场景:所有容器名称包含 web 关键字,需要滚动重启。
推荐方法:先找到容器,再逐个安全重启。

#!/bin/bash
# 文件名: batch_restart_containers.sh
# 过滤关键字(支持正则)
KEYWORD="web"
# 等待时间
WAIT_SECONDS=15
echo "查找名称包含 '$KEYWORD' 的容器..."
containers=$(docker ps --filter "name=$KEYWORD" --format "{{.Names}}")
if [ -z "$containers" ]; then
    echo "未找到符合条件的运行中的容器。"
    exit 1
fi
echo "找到以下容器:"
echo "$containers"
echo "开始滚动重启..."
for container in $containers; do
    echo -n "正在重启 $container ... "
    # 执行重启
    docker restart "$container" &>/dev/null
    if [ $? -eq 0 ]; then
        echo "✓"
    else
        echo "✗ 失败"
        continue
    fi
    # 等待指定秒数,再重启下一个
    sleep "$WAIT_SECONDS"
done
echo "所有容器重启完成。"

更极致的:并行 + 健康检查 + 日志(高级版)

如果你的服务数量非常多(100+),且需要“快速 + 安全”,可以使用 AnsibleParallel SSH (pssh) + 健康检查脚本

这里提供一个 自制的快速并行脚本(需谨慎使用,仅适用于不依赖顺序的场景):

#!/bin/bash
# 并行重启(需先确认业务能承受)
# 依赖: parallel (apt install parallel)
SERVER_LIST="ip.txt"
USER="root"
SSH_OPTS="-o StrictHostKeyChecking=no -o ConnectTimeout=10"
restart_one() {
    local ip=$1
    ssh $SSH_OPTS "$USER@$ip" "sudo reboot" 2>&1
    echo "$ip: 重启命令已发送"
}
export -f restart_one
export USER SSH_OPTS
cat "$SERVER_LIST" | parallel -j 5 restart_one
# 控制同时最多 5 台重启(-j 5)

⚠️ 重要安全建议

  1. 一定穿行:除非你非常了解业务架构,否则不要并行重启所有服务器/容器(否则你的系统可能会瞬间雪崩)。
  2. 先 test:用一个 echo--dry-run 模式先验证脚本会操作哪些对象。
  3. 备份配置文件:重启前最好执行自动备份(cp /etc/nginx/nginx.conf /etc/nginx/nginx.conf.bak)。
  4. 记录日志:给脚本加入 >> /var/log/restart.log 2>&1
  5. 权限管理:建议使用普通用户 + sudo,避免 root 权限滥用。
  • 重启远程服务器 → SSH + 串行循环
  • 重启本地服务 → systemctl 循环
  • 重启 Docker 容器 → docker restart + 关键字过滤
  • 超大规模 → 用 Ansible 剧本(playbook)或 parallel 工具

如果你有更具体的场景(用哪个系统?是重启服务还是整个机器?),告诉我,我可以帮你定制脚本

抱歉,评论功能暂时关闭!