根据需求,创建一个可复用的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")。此方案通过解耦脚本和配置,实现了对不同服务的灵活管理,无需修改脚本即可扩展新服务。