#!/bin/bash # WebSocket 服务管理脚本 # 路径配置 SCRIPT_PATH="/home/wwwroot/spacestation/www/api/websocket.php" PID_FILE="/var/run/websocket.pid" LOG_FILE="/tmp/websocket.log" # 颜色定义 RED='\033[0;31m' GREEN='\033[0;32m' YELLOW='\033[1;33m' NC='\033[0m' # No Color # 检查PHP和Swoole扩展 check_environment() { if ! command -v php &> /dev/null; then echo -e "${RED}错误: 未找到PHP${NC}" exit 1 fi if ! php -m | grep -q "swoole"; then echo -e "${RED}错误: PHP未安装Swoole扩展${NC}" exit 1 fi } # 获取进程ID get_pid() { if [ -f "$PID_FILE" ]; then cat "$PID_FILE" fi } # 检查服务是否运行 is_running() { local pid=$(get_pid) if [ -n "$pid" ] && kill -0 "$pid" 2>/dev/null; then return 0 else return 1 fi } # 启动服务 start() { check_environment if is_running; then echo -e "${YELLOW}警告: WebSocket服务已在运行 (PID: $(get_pid))${NC}" return 1 fi echo -n "正在启动WebSocket服务... " # 后台启动服务 nohup php "$SCRIPT_PATH" > "$LOG_FILE" 2>&1 & local pid=$! # 等待服务启动 sleep 2 if kill -0 $pid 2>/dev/null; then echo "$pid" > "$PID_FILE" echo -e "${GREEN}成功${NC} (PID: $pid)" else echo -e "${RED}失败${NC}" return 1 fi } # 停止服务 stop() { if ! is_running; then echo -e "${YELLOW}WebSocket服务未运行${NC}" return 1 fi local pid=$(get_pid) echo -n "正在停止WebSocket服务 (PID: $pid)... " # 优雅地停止服务 if kill -TERM "$pid" 2>/dev/null; then # 等待进程结束 local count=0 while kill -0 "$pid" 2>/dev/null && [ $count -lt 10 ]; do sleep 1 ((count++)) done # 如果进程仍未结束,则强制杀死 if kill -0 "$pid" 2>/dev/null; then kill -KILL "$pid" sleep 1 fi rm -f "$PID_FILE" echo -e "${GREEN}成功${NC}" else echo -e "${RED}失败${NC}" return 1 fi } # 重启服务 restart() { stop sleep 2 start } # 查看服务状态 status() { if is_running; then local pid=$(get_pid) echo -e "${GREEN}WebSocket服务正在运行 (PID: $pid)${NC}" # 显示更多详细信息 ps -p "$pid" -o pid,ppid,cmd,etime --no-headers 2>/dev/null else echo -e "${YELLOW}WebSocket服务未运行${NC}" return 1 fi } # 查看日志 logs() { if [ -f "$LOG_FILE" ]; then tail -f "$LOG_FILE" else echo -e "${YELLOW}日志文件不存在: $LOG_FILE${NC}" return 1 fi } # 查看最后的日志 tail_logs() { local lines=${1:-20} if [ -f "$LOG_FILE" ]; then tail -n "$lines" "$LOG_FILE" else echo -e "${YELLOW}日志文件不存在: $LOG_FILE${NC}" return 1 fi } # 显示帮助信息 show_help() { echo "用法: $0 {start|stop|restart|status|logs|tail|help}" echo "" echo "命令说明:" echo " start 启动WebSocket服务" echo " stop 停止WebSocket服务" echo " restart 重启WebSocket服务" echo " status 查看服务状态" echo " logs 实时查看日志" echo " tail [n] 查看最后n行日志 (默认20行)" echo " help 显示此帮助信息" } # 主逻辑 case "$1" in start) start ;; stop) stop ;; restart) restart ;; status) status ;; logs) logs ;; tail) tail_logs "$2" ;; help|--help|-h) show_help ;; *) echo -e "${RED}无效参数: $1${NC}" show_help exit 1 ;; esac exit $?