服务管理脚本#

脚本说明#

服务管理脚本用于批量管理系统服务,包括启动、停止、重启、状态检查等操作。

脚本代码#

#!/bin/bash

# 服务管理脚本
# 功能:批量管理系统服务
# 作者:System Admin
# 日期:2024-01-01

set -euo pipefail

# 配置变量
LOG_FILE="/var/log/service_manager.log"
SERVICES_FILE=""
ACTION="status"
PARALLEL=false

# 颜色定义
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[0;33m'
BLUE='\033[0;34m'
NC='\033[0m'

# 日志函数
log() {
    local level=$1
    shift
    local timestamp=$(date '+%Y-%m-%d %H:%M:%S')
    echo "[$timestamp] [$level] $@" | tee -a "$LOG_FILE"
}

log_info() {
    log "INFO" "$@"
}

log_error() {
    log "ERROR" "$@"
}

# 检查systemctl
check_systemctl() {
    if ! command -v systemctl &> /dev/null; then
        log_error "systemctl未安装"
        return 1
    fi
    return 0
}

# 列出所有服务
list_services() {
    log_info "列出所有服务"
    
    systemctl list-units --type=service --all
}

# 列出运行中的服务
list_running_services() {
    log_info "列出运行中的服务"
    
    systemctl list-units --type=service --state=running
}

# 检查服务状态
check_service_status() {
    local service=$1
    
    log_info "检查服务状态: $service"
    
    local status=$(systemctl is-active "$service")
    local enabled=$(systemctl is-enabled "$service")
    
    echo "服务: $service"
    echo "状态: $status"
    echo "开机启动: $enabled"
    
    if [ "$status" = "active" ]; then
        return 0
    else
        return 1
    fi
}

# 启动服务
start_service() {
    local service=$1
    
    log_info "启动服务: $service"
    
    if systemctl start "$service"; then
        log_info "服务启动成功: $service"
        return 0
    else
        log_error "服务启动失败: $service"
        return 1
    fi
}

# 停止服务
stop_service() {
    local service=$1
    
    log_info "停止服务: $service"
    
    if systemctl stop "$service"; then
        log_info "服务停止成功: $service"
        return 0
    else
        log_error "服务停止失败: $service"
        return 1
    fi
}

# 重启服务
restart_service() {
    local service=$1
    
    log_info "重启服务: $service"
    
    if systemctl restart "$service"; then
        log_info "服务重启成功: $service"
        return 0
    else
        log_error "服务重启失败: $service"
        return 1
    fi
}

# 重新加载服务
reload_service() {
    local service=$1
    
    log_info "重新加载服务: $service"
    
    if systemctl reload "$service"; then
        log_info "服务重新加载成功: $service"
        return 0
    else
        log_error "服务重新加载失败: $service"
        return 1
    fi
}

# 启用服务
enable_service() {
    local service=$1
    
    log_info "启用服务: $service"
    
    if systemctl enable "$service"; then
        log_info "服务启用成功: $service"
        return 0
    else
        log_error "服务启用失败: $service"
        return 1
    fi
}

# 禁用服务
disable_service() {
    local service=$1
    
    log_info "禁用服务: $service"
    
    if systemctl disable "$service"; then
        log_info "服务禁用成功: $service"
        return 0
    else
        log_error "服务禁用失败: $service"
        return 1
    fi
}

# 批量操作服务
batch_operation() {
    local action=$1
    local services=($2)
    
    log_info "批量操作: $action"
    
    local success=0
    local failed=0
    
    for service in "${services[@]}"; do
        case $action in
            start)
                if start_service "$service"; then
                    success=$((success + 1))
                else
                    failed=$((failed + 1))
                fi
                ;;
            stop)
                if stop_service "$service"; then
                    success=$((success + 1))
                else
                    failed=$((failed + 1))
                fi
                ;;
            restart)
                if restart_service "$service"; then
                    success=$((success + 1))
                else
                    failed=$((failed + 1))
                fi
                ;;
            status)
                if check_service_status "$service"; then
                    success=$((success + 1))
                else
                    failed=$((failed + 1))
                fi
                ;;
            enable)
                if enable_service "$service"; then
                    success=$((success + 1))
                else
                    failed=$((failed + 1))
                fi
                ;;
            disable)
                if disable_service "$service"; then
                    success=$((success + 1))
                else
                    failed=$((failed + 1))
                fi
                ;;
        esac
    done
    
    log_info "批量操作完成: 成功=$success, 失败=$failed"
}

# 显示帮助
show_help() {
    echo "用法: $0 [选项] <操作> [服务...]"
    echo ""
    echo "选项:"
    echo "  -f <文件>        服务列表文件"
    echo "  -p               并行执行"
    echo "  -h               显示帮助信息"
    echo ""
    echo "操作:"
    echo "  list              列出所有服务"
    echo "  running           列出运行中的服务"
    echo "  status <服务>     检查服务状态"
    echo "  start <服务>      启动服务"
    echo "  stop <服务>       停止服务"
    echo "  restart <服务>    重启服务"
    echo "  reload <服务>     重新加载服务"
    echo "  enable <服务>     启用服务"
    echo "  disable <服务>    禁用服务"
    echo ""
    echo "示例:"
    echo "  $0 list"
    echo "  $0 status nginx"
    echo "  $0 start nginx mysql"
    echo "  $0 restart nginx"
    echo "  $0 -f services.txt restart"
}

# 主函数
main() {
    # 解析选项
    while getopts "f:ph" opt; do
        case $opt in
            f)
                SERVICES_FILE="$OPTARG"
                log_info "服务列表文件: $SERVICES_FILE"
                ;;
            p)
                PARALLEL=true
                log_info "并行执行"
                ;;
            h)
                show_help
                exit 0
                ;;
            *)
                log_error "无效选项: $opt"
                show_help
                exit 1
                ;;
        esac
    done
    
    shift $((OPTIND - 1))
    
    # 检查systemctl
    if ! check_systemctl; then
        exit 1
    fi
    
    # 检查操作
    if [ $# -eq 0 ]; then
        log_error "缺少操作"
        show_help
        exit 1
    fi
    
    ACTION=$1
    shift
    
    # 执行操作
    case $ACTION in
        list)
            list_services
            ;;
        running)
            list_running_services
            ;;
        status|start|stop|restart|reload|enable|disable)
            if [ $# -eq 0 ] && [ -z "$SERVICES_FILE" ]; then
                log_error "缺少服务参数"
                show_help
                exit 1
            fi
            
            # 获取服务列表
            local services=()
            if [ -n "$SERVICES_FILE" ]; then
                mapfile -t services < "$SERVICES_FILE"
            else
                services=("$@")
            fi
            
            # 执行批量操作
            batch_operation "$ACTION" "${services[*]}"
            ;;
        *)
            log_error "无效的操作: $ACTION"
            show_help
            exit 1
            ;;
    esac
}

# 执行主函数
main "$@"

使用说明#

  1. 添加执行权限:

    chmod +x service_manager.sh
  2. 基本用法:

    # 列出所有服务
    ./service_manager.sh list
    
    # 列出运行中的服务
    ./service_manager.sh running
    
    # 检查服务状态
    ./service_manager.sh status nginx
    
    # 启动服务
    ./service_manager.sh start nginx
    
    # 停止服务
    ./service_manager.sh stop nginx
    
    # 重启服务
    ./service_manager.sh restart nginx
  3. 批量操作:

    # 创建服务列表文件
    cat > services.txt <<EOF
    nginx
    mysql
    redis
    EOF
    
    # 批量启动
    ./service_manager.sh -f services.txt start
    
    # 批量重启
    ./service_manager.sh -f services.txt restart

功能特点#

  • 服务状态检查
  • 服务启动/停止/重启
  • 服务启用/禁用
  • 批量服务操作
  • 服务列表显示
  • 详细的操作日志

依赖项#

  • systemctl: 用于服务管理

注意事项#

  1. 需要root权限管理服务
  2. 批量操作时注意服务依赖关系
  3. 重启服务可能导致服务中断
  4. 建议在维护窗口执行批量操作