根据需求,创建一个可复用的Shell脚本,通过配置文件管理不同服务的启动、停止和状态检查。以下是实现方案: **1. 创建脚本文件 `service_ctl.sh`:** ```bash #!/bin/bash # 检查参数是否正确 if [ $# -ne 2 ]; then echo "Usage: $0 {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`:** ```bash # 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. 使用说明:** - **赋予执行权限:** ```bash chmod +x service_ctl.sh ``` - **启动服务:** ```bash ./service_ctl.sh mysql start ./service_ctl.sh apache2 start ``` - **停止服务:** ```bash ./service_ctl.sh mysql stop ./service_ctl.sh nginx stop ``` - **查看状态:** ```bash ./service_ctl.sh mysql status ``` - **重启服务:** ```bash ./service_ctl.sh apache2 restart ``` **4. 扩展新服务:** 在 `service.conf` 中添加对应服务的配置即可,例如添加 Redis: ```bash # 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 文件,确保服务实际生成该文件。 此方案通过解耦脚本和配置,实现了对不同服务的灵活管理,无需修改脚本即可扩展新服务。