本文目录导读:

当然可以!实用脚本完全可以批量重启服务、服务器、容器或应用,关键在于明确你的“重启”对象是什么(是远程服务器、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+),且需要“快速 + 安全”,可以使用 Ansible 或 Parallel 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)
⚠️ 重要安全建议
- 一定穿行:除非你非常了解业务架构,否则不要并行重启所有服务器/容器(否则你的系统可能会瞬间雪崩)。
- 先 test:用一个
echo或--dry-run模式先验证脚本会操作哪些对象。 - 备份配置文件:重启前最好执行自动备份(
cp /etc/nginx/nginx.conf /etc/nginx/nginx.conf.bak)。 - 记录日志:给脚本加入
>> /var/log/restart.log 2>&1。 - 权限管理:建议使用普通用户 + sudo,避免 root 权限滥用。
- 重启远程服务器 → SSH + 串行循环
- 重启本地服务 → systemctl 循环
- 重启 Docker 容器 → docker restart + 关键字过滤
- 超大规模 → 用 Ansible 剧本(playbook)或 parallel 工具
如果你有更具体的场景(用哪个系统?是重启服务还是整个机器?),告诉我,我可以帮你定制脚本。