Linux 服务控制脚本.md 3.3 KB

根据需求,创建一个可复用的Shell脚本,通过配置文件管理不同服务的启动、停止和状态检查。以下是实现方案:

1. 创建脚本文件 service_ctl.sh

#!/bin/bash

# 检查参数是否正确
if [ $# -ne 2 ]; then
    echo "Usage: $0 <service_name> {start|stop|status|restart}"
    exit 1
fi

SERVICE="$1"
ACTION="$2"
CONFIG_FILE="./service.conf"

# 加载配置文件
if [ ! -f "$CONFIG_FILE" ]; then
    echo "配置文件 $CONFIG_FILE 不存在"
    exit 1
fi
source "$CONFIG_FILE"

# 获取配置变量
START_CMD="${SERVICE}_start"
STOP_CMD="${SERVICE}_stop"
PID_FILE="${SERVICE}_pid"

# 检查配置是否完整
if [[ -z "${!START_CMD}" || -z "${!STOP_CMD}" || -z "${!PID_FILE}" ]]; then
    echo "错误:服务 '$SERVICE' 的配置不完整"
    exit 1
fi

# 执行动作
case "$ACTION" in
    start)
        echo "启动 $SERVICE ..."
        eval "${!START_CMD}"
        ;;
    stop)
        echo "停止 $SERVICE ..."
        eval "${!STOP_CMD}"
        ;;
    status)
        if [ -f "${!PID_FILE}" ]; then
            PID=$(cat "${!PID_FILE}")
            if ps -p "$PID" > /dev/null 2>&1; then
                echo "状态:$SERVICE 正在运行 (PID: $PID)"
                exit 0
            else
                echo "状态:PID 文件存在但进程未运行"
                exit 1
            fi
        else
            echo "状态:$SERVICE 未运行"
            exit 3
        fi
        ;;
    restart)
        echo "重启 $SERVICE ..."
        eval "${!STOP_CMD}"
        sleep 2
        eval "${!START_CMD}"
        ;;
    *)
        echo "无效操作: $ACTION"
        exit 1
        ;;
esac

exit 0

2. 创建配置文件 service.conf

# MySQL 配置示例
mysql_start="/usr/bin/mysqld_safe --defaults-file=/etc/mysql/my.cnf"
mysql_stop="/usr/bin/mysqladmin shutdown"
mysql_pid="/var/run/mysqld/mysqld.pid"

# Apache2 配置示例
apache2_start="/usr/sbin/apachectl start"
apache2_stop="/usr/sbin/apachectl stop"
apache2_pid="/var/run/apache2/apache2.pid"

# Nginx 配置示例
nginx_start="/usr/sbin/nginx"
nginx_stop="/usr/sbin/nginx -s stop"
nginx_pid="/var/run/nginx.pid"

3. 使用说明:

  • 赋予执行权限:

    chmod +x service_ctl.sh
    
  • 启动服务:

    ./service_ctl.sh mysql start
    ./service_ctl.sh apache2 start
    
  • 停止服务:

    ./service_ctl.sh mysql stop
    ./service_ctl.sh nginx stop
    
  • 查看状态:

    ./service_ctl.sh mysql status
    
  • 重启服务:

    ./service_ctl.sh apache2 restart
    

4. 扩展新服务:

service.conf 中添加对应服务的配置即可,例如添加 Redis:

# Redis 配置示例
redis_start="/usr/bin/redis-server /etc/redis/redis.conf"
redis_stop="/usr/bin/redis-cli shutdown"
redis_pid="/var/run/redis/redis-server.pid"

5. 注意事项:

  • 确保配置文件中命令的路径正确,必要时使用 which 命令查找路径。
  • 需要 sudo 权限的命令可直接写在配置中(如 mysql_start="sudo /path/to/cmd")。
  • 状态检查基于 PID 文件,确保服务实际生成该文件。

此方案通过解耦脚本和配置,实现了对不同服务的灵活管理,无需修改脚本即可扩展新服务。