本文目录导读:

我来介绍几种不同环境下批量重启指定服务的方法。
Linux 系统 (Shell 脚本)
基础版 - 重启多个服务
#!/bin/bash
# 定义服务列表
services=("nginx" "mysql" "php-fpm" "redis")
# 遍历并重启每个服务
for service in "${services[@]}"; do
echo "正在重启 $service..."
sudo systemctl restart "$service"
if [ $? -eq 0 ]; then
echo "$service 重启成功"
else
echo "$service 重启失败"
fi
done
进阶版 - 带错误处理和日志
#!/bin/bash
# 配置
SERVICES=("nginx" "mysql" "php-fpm")
LOG_FILE="/var/log/service_restart.log"
TIMEOUT=30
# 日志函数
log() {
echo "[$(date '+%Y-%m-%d %H:%M:%S')] $1" | tee -a "$LOG_FILE"
}
# 检查服务状态并重启
restart_service() {
local service=$1
if systemctl is-active --quiet "$service"; then
log "正在重启 $service..."
systemctl restart "$service"
else
log "$service 未运行,正在启动..."
systemctl start "$service"
fi
# 等待服务启动
sleep 2
# 检查重启是否成功
if systemctl is-active --quiet "$service"; then
log "$service 操作成功"
return 0
else
log "$service 操作失败"
return 1
fi
}
# 主流程
log "开始批量重启服务"
failed_services=()
for service in "${SERVICES[@]}"; do
if ! restart_service "$service"; then
failed_services+=("$service")
fi
done
# 输出结果
if [ ${#failed_services[@]} -eq 0 ]; then
log "所有服务重启成功"
else
log "以下服务重启失败: ${failed_services[*]}"
exit 1
fi
从文件读取服务列表
#!/bin/bash
# 从配置文件读取服务列表
SERVICE_FILE="/etc/restart_list.txt"
# 检查文件是否存在
if [ ! -f "$SERVICE_FILE" ]; then
echo "错误: 配置文件 $SERVICE_FILE 不存在"
exit 1
fi
# 读取文件中的服务名并重启
while IFS= read -r service || [ -n "$service" ]; do
# 跳过空行和注释
[[ -z "$service" || "$service" =~ ^# ]] && continue
echo "处理服务: $service"
sudo systemctl restart "$service"
done < "$SERVICE_FILE"
Windows 系统 (PowerShell)
重启Windows服务
# 定义服务列表
$services = @("W3SVC", "MSSQLSERVER", "MySQL80")
# 批量重启服务
foreach ($service in $services) {
Write-Host "正在重启 $service..."
try {
Restart-Service -Name $service -Force -ErrorAction Stop
Write-Host "$service 重启成功" -ForegroundColor Green
}
catch {
Write-Host "重启 $service 失败: $_" -ForegroundColor Red
}
}
带状态检查的高级版本
param(
[string[]]$ServiceNames,
[string]$ServiceFile,
[int]$TimeoutSeconds = 30
)
function Restart-ServiceWithCheck {
param(
[string]$ServiceName
)
try {
$service = Get-Service -Name $ServiceName -ErrorAction Stop
Write-Host "正在处理: $ServiceName (当前状态: $($service.Status))"
# 停止服务
if ($service.Status -eq 'Running') {
Stop-Service -Name $ServiceName -Force
$service.WaitForStatus('Stopped', (New-TimeSpan -Seconds $TimeoutSeconds))
}
# 启动服务
Start-Service -Name $ServiceName
$service.WaitForStatus('Running', (New-TimeSpan -Seconds $TimeoutSeconds))
Write-Host "$ServiceName 重启成功" -ForegroundColor Green
return $true
}
catch {
Write-Host "操作 $ServiceName 失败: $_" -ForegroundColor Red
return $false
}
}
# 获取服务列表
if ($ServiceFile) {
$services = Get-Content $ServiceFile | Where-Object { $_ -and $_ -notmatch '^#' }
}
elseif ($ServiceNames) {
$services = $ServiceNames
}
else {
# 默认服务列表
$services = @("Spooler", "W3SVC", "MSSQLSERVER")
}
# 批量处理
$results = @{}
foreach ($service in $services) {
$results[$service] = Restart-ServiceWithCheck -ServiceName $service
}
# 输出总结
Write-Host "`n=== 操作总结 ===" -ForegroundColor Cyan
$results.GetEnumerator() | ForEach-Object {
$status = if ($_.Value) { "成功" } else { "失败" }
$color = if ($_.Value) { "Green" } else { "Red" }
Write-Host "$($_.Key): $status" -ForegroundColor $color
}
跨平台方案 (Python)
#!/usr/bin/env python3
import subprocess
import sys
import time
import logging
# 配置日志
logging.basicConfig(
level=logging.INFO,
format='%(asctime)s - %(levelname)s - %(message)s'
)
class ServiceManager:
def __init__(self, services, use_sudo=True):
self.services = services
self.use_sudo = use_sudo
def restart_service(self, service_name):
"""重启单个服务"""
try:
# 构建命令
if sys.platform.startswith('linux'):
cmd = ['sudo', 'systemctl', 'restart', service_name]
elif sys.platform == 'win32':
cmd = ['powershell', 'Restart-Service', '-Name', service_name, '-Force']
else:
raise OSError(f"不支持的操作系统: {sys.platform}")
# 执行命令
result = subprocess.run(
cmd,
capture_output=True,
text=True,
timeout=30
)
if result.returncode == 0:
logging.info(f"{service_name} 重启成功")
return True
else:
logging.error(f"{service_name} 重启失败: {result.stderr}")
return False
except subprocess.TimeoutExpired:
logging.error(f"{service_name} 重启超时")
return False
except Exception as e:
logging.error(f"{service_name} 重启异常: {str(e)}")
return False
def restart_all(self):
"""重启所有服务"""
results = {}
for service in self.services:
logging.info(f"开始处理: {service}")
results[service] = self.restart_service(service)
time.sleep(2) # 服务间等待
# 输出结果
self._print_results(results)
return results
def _print_results(self, results):
"""打印结果"""
logging.info("=" * 40)
logging.info("批量重启服务结果:")
successful = 0
failed = 0
for service, status in results.items():
if status:
logging.info(f"✓ {service}: 成功")
successful += 1
else:
logging.error(f"✗ {service}: 失败")
failed += 1
logging.info(f"总计: {len(results)}, 成功: {successful}, 失败: {failed}")
# 使用示例
if __name__ == "__main__":
# 定义服务列表
services = [
"nginx",
"mysql",
"php8.2-fpm",
"redis-server"
]
# 创建管理器并执行
manager = ServiceManager(services)
results = manager.restart_all()
# 检查是否有失败的服务
if all(results.values()):
print("所有服务重启成功")
sys.exit(0)
else:
print("部分服务重启失败")
sys.exit(1)
使用 Docker 容器
#!/bin/bash
# 重启多个 Docker 容器
containers=("web-app" "api-server" "database" "redis-cache")
for container in "${containers[@]}"; do
echo "重启容器: $container"
# 检查容器是否存在
if docker ps -a --format '{{.Names}}' | grep -q "^$container$"; then
docker restart "$container"
echo "容器 $container 已重启"
else
echo "容器 $container 不存在"
fi
sleep 2
done
使用建议
-
安全考虑:
- 添加错误处理机制
- 实施超时控制
- 保持操作日志
-
性能优化:
- 服务间添加适当延迟
- 考虑并行重启(需谨慎)
- 监控系统资源使用
-
最佳实践:
- 先测试在非生产环境
- 准备回滚方案
- 设置监控告警
- 做好备份
选择哪种方案取决于你的操作系统、服务类型和具体需求,建议先在测试环境验证,再应用到生产环境。