paper-burner/stop.sh

111 lines
2.8 KiB
Bash

#!/bin/bash
# Paper Burner X - 停止脚本
# 颜色定义
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
BLUE='\033[0;34m'
NC='\033[0m' # No Color
PROJECT_DIR="$(cd "$(dirname "$0")" && pwd)"
BACKEND_PORT=3456
FRONTEND_PORT=5173
PID_DIR="$PROJECT_DIR/.pids"
echo -e "${BLUE}"
echo "======================================"
echo " Paper Burner X - 停止脚本"
echo "======================================"
echo -e "${NC}"
# 函数:根据端口查找并杀死进程
kill_port() {
local port=$1
local pids=$(lsof -t -i:$port 2>/dev/null)
if [ -n "$pids" ]; then
echo -e "${YELLOW}→ 终止端口 $port 上的进程...${NC}"
for pid in $pids; do
kill -15 $pid 2>/dev/null
if kill -0 $pid 2>/dev/null; then
sleep 1
kill -9 $pid 2>/dev/null
fi
echo -e " ${GREEN}已终止进程 $pid${NC}"
done
return 0
else
return 1
fi
}
# 函数:根据 PID 文件杀死进程
kill_pid_file() {
local pid_file=$1
local service_name=$2
if [ -f "$pid_file" ]; then
local pid=$(cat "$pid_file")
if [ -n "$pid" ] && kill -0 $pid 2>/dev/null; then
echo -e "${YELLOW}→ 终止 $service_name (PID: $pid)...${NC}"
kill -15 $pid 2>/dev/null
# 等待进程退出
local count=0
while kill -0 $pid 2>/dev/null && [ $count -lt 5 ]; do
sleep 0.5
count=$((count + 1))
done
# 如果进程还在,强制终止
if kill -0 $pid 2>/dev/null; then
kill -9 $pid 2>/dev/null
fi
echo -e " ${GREEN}已终止${NC}"
fi
rm -f "$pid_file"
fi
}
STOPPED_SOMETHING=false
# 1. 通过 PID 文件停止
echo -e "${YELLOW}[1/2] 通过 PID 文件停止服务...${NC}"
if [ -f "$PID_DIR/backend.pid" ]; then
kill_pid_file "$PID_DIR/backend.pid" "后端服务"
STOPPED_SOMETHING=true
fi
if [ -f "$PID_DIR/frontend.pid" ]; then
kill_pid_file "$PID_DIR/frontend.pid" "前端服务"
STOPPED_SOMETHING=true
fi
# 2. 通过端口确保彻底清理
echo -e "${YELLOW}[2/2] 确保端口已释放...${NC}"
if kill_port $BACKEND_PORT; then
STOPPED_SOMETHING=true
else
echo -e " ${GREEN}端口 $BACKEND_PORT 已空闲${NC}"
fi
if kill_port $FRONTEND_PORT; then
STOPPED_SOMETHING=true
else
echo -e " ${GREEN}端口 $FRONTEND_PORT 已空闲${NC}"
fi
echo ""
if [ "$STOPPED_SOMETHING" = true ]; then
echo -e "${GREEN}"
echo "======================================"
echo " 服务已停止"
echo "======================================"
echo -e "${NC}"
else
echo -e "${YELLOW}"
echo "======================================"
echo " 没有运行中的服务"
echo "======================================"
echo -e "${NC}"
fi