怎样用脚本批量重启指定服务?

wen 实用脚本 2

本文目录导读:

怎样用脚本批量重启指定服务?

  1. Linux 系统 (Shell 脚本)
  2. Windows 系统 (PowerShell)
  3. 跨平台方案 (Python)
  4. 使用 Docker 容器
  5. 使用建议

我来介绍几种不同环境下批量重启指定服务的方法。

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

使用建议

  1. 安全考虑

    • 添加错误处理机制
    • 实施超时控制
    • 保持操作日志
  2. 性能优化

    • 服务间添加适当延迟
    • 考虑并行重启(需谨慎)
    • 监控系统资源使用
  3. 最佳实践

    • 先测试在非生产环境
    • 准备回滚方案
    • 设置监控告警
    • 做好备份

选择哪种方案取决于你的操作系统、服务类型和具体需求,建议先在测试环境验证,再应用到生产环境。

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