Normalize run.sh line endings

This commit is contained in:
2026-02-27 13:40:06 +08:00
parent 8a369a6535
commit c31cc840d7

336
run.sh
View File

@@ -1,168 +1,168 @@
#!/bin/bash #!/bin/bash
# --- 颜色定义 --- # --- 颜色定义 ---
GREEN='\033[0;32m' GREEN='\033[0;32m'
BLUE='\033[0;34m' BLUE='\033[0;34m'
YELLOW='\033[1;33m' YELLOW='\033[1;33m'
RED='\033[0;31m' RED='\033[0;31m'
NC='\033[0m' NC='\033[0m'
PID_FILE="app.pid" PID_FILE="app.pid"
LOG_FILE="app.log" LOG_FILE="app.log"
get_port_pids() { get_port_pids() {
if command -v lsof >/dev/null 2>&1; then if command -v lsof >/dev/null 2>&1; then
lsof -t -i:2333 2>/dev/null lsof -t -i:2333 2>/dev/null
elif command -v ss >/dev/null 2>&1; then elif command -v ss >/dev/null 2>&1; then
ss -ltnp 'sport = :2333' 2>/dev/null | sed -n 's/.*pid=\([0-9]\+\).*/\1/p' | sort -u ss -ltnp 'sport = :2333' 2>/dev/null | sed -n 's/.*pid=\([0-9]\+\).*/\1/p' | sort -u
elif command -v netstat >/dev/null 2>&1; then elif command -v netstat >/dev/null 2>&1; then
netstat -ltnp 2>/dev/null | sed -n 's/.* \([0-9]\+\)\/.*/\1/p' | sort -u netstat -ltnp 2>/dev/null | sed -n 's/.* \([0-9]\+\)\/.*/\1/p' | sort -u
elif command -v fuser >/dev/null 2>&1; then elif command -v fuser >/dev/null 2>&1; then
fuser -n tcp 2333 2>/dev/null | tr ' ' '\n' | sort -u fuser -n tcp 2333 2>/dev/null | tr ' ' '\n' | sort -u
fi fi
} }
prepare_standalone() { prepare_standalone() {
if [ -f ".next/standalone/server.js" ]; then if [ -f ".next/standalone/server.js" ]; then
rm -rf .next/standalone/.next .next/standalone/public rm -rf .next/standalone/.next .next/standalone/public
mkdir -p .next/standalone/.next mkdir -p .next/standalone/.next
[ -d .next/static ] && cp -r .next/static .next/standalone/.next/ [ -d .next/static ] && cp -r .next/static .next/standalone/.next/
[ -d public ] && cp -r public .next/standalone/ [ -d public ] && cp -r public .next/standalone/
fi fi
} }
start_server() { start_server() {
if [ -f ".next/standalone/server.js" ]; then if [ -f ".next/standalone/server.js" ]; then
# Standalone 模式:从 standalone 目录启动服务器 # Standalone 模式:从 standalone 目录启动服务器
cd .next/standalone cd .next/standalone
NODE_ENV=production PORT=2333 nohup node server.js > "../../$LOG_FILE" 2>&1 & NODE_ENV=production PORT=2333 nohup node server.js > "../../$LOG_FILE" 2>&1 &
cd ../.. cd ../..
else else
# 非 standalone 模式:使用 pnpm start # 非 standalone 模式:使用 pnpm start
NODE_ENV=production nohup $PM run start > "$LOG_FILE" 2>&1 & NODE_ENV=production nohup $PM run start > "$LOG_FILE" 2>&1 &
fi fi
} }
# --- 逻辑封装 --- # --- 逻辑封装 ---
function do_stop() { function do_stop() {
printf "${YELLOW}正在停止 STARK Todo List...${NC}\n" printf "${YELLOW}正在停止 STARK Todo List...${NC}\n"
# 1. 首先尝试通过 PID 文件停止 # 1. 首先尝试通过 PID 文件停止
if [ -f "$PID_FILE" ]; then if [ -f "$PID_FILE" ]; then
PID=$(cat "$PID_FILE") PID=$(cat "$PID_FILE")
pkill -P $PID >/dev/null 2>&1 pkill -P $PID >/dev/null 2>&1
kill $PID >/dev/null 2>&1 kill $PID >/dev/null 2>&1
rm "$PID_FILE" rm "$PID_FILE"
fi fi
# 2. 强力兜底:查找并杀死占?2333 端口的所?Node 进程 # 2. 强力兜底:查找并杀死占?2333 端口的所?Node 进程
PORT_PIDS=$(get_port_pids) PORT_PIDS=$(get_port_pids)
if [ -n "$PORT_PIDS" ]; then if [ -n "$PORT_PIDS" ]; then
for P in $PORT_PIDS; do for P in $PORT_PIDS; do
kill -9 $P >/dev/null 2>&1 kill -9 $P >/dev/null 2>&1
done done
fi fi
printf "${YELLOW}已停止所有相关进程并释放端口?{NC}\n" printf "${YELLOW}已停止所有相关进程并释放端口?{NC}\n"
} }
function do_start() { function do_start() {
if [ -f "$PID_FILE" ] && kill -0 $(cat "$PID_FILE") 2>/dev/null; then if [ -f "$PID_FILE" ] && kill -0 $(cat "$PID_FILE") 2>/dev/null; then
printf "${YELLOW}App already running (PID: $(cat $PID_FILE))${NC}\n" printf "${YELLOW}App already running (PID: $(cat $PID_FILE))${NC}\n"
return 0 return 0
fi fi
PORT_PID=$(get_port_pids) PORT_PID=$(get_port_pids)
if [ -n "$PORT_PID" ]; then if [ -n "$PORT_PID" ]; then
printf "${YELLOW}Port 2333 is in use, trying to stop old process...${NC}\n" printf "${YELLOW}Port 2333 is in use, trying to stop old process...${NC}\n"
do_stop do_stop
sleep 1 sleep 1
PORT_PID=$(get_port_pids) PORT_PID=$(get_port_pids)
if [ -n "$PORT_PID" ]; then if [ -n "$PORT_PID" ]; then
printf "${RED}Error: port 2333 still in use after auto-stop${NC}\n" printf "${RED}Error: port 2333 still in use after auto-stop${NC}\n"
return 1 return 1
fi fi
fi fi
printf "${GREEN}Starting STARK Todo List (production) with $PM...${NC}\n" printf "${GREEN}Starting STARK Todo List (production) with $PM...${NC}\n"
NEED_BUILD=0 NEED_BUILD=0
if [ ! -f ".next/BUILD_ID" ] && [ ! -f ".next/standalone/server.js" ]; then if [ ! -f ".next/BUILD_ID" ] && [ ! -f ".next/standalone/server.js" ]; then
NEED_BUILD=1 NEED_BUILD=1
fi fi
if [ "$FORCE_BUILD" = "1" ] || [ "$2" = "build" ]; then if [ "$FORCE_BUILD" = "1" ] || [ "$2" = "build" ]; then
NEED_BUILD=1 NEED_BUILD=1
fi fi
if [ "$NEED_BUILD" -eq 1 ]; then if [ "$NEED_BUILD" -eq 1 ]; then
$PM install > /dev/null 2>&1 $PM install > /dev/null 2>&1
$PM run build > /dev/null 2>&1 $PM run build > /dev/null 2>&1
prepare_standalone prepare_standalone
else else
printf "${BLUE}Build artifacts found, skipping build. Force rebuild: FORCE_BUILD=1 bash run.sh start or bash run.sh start build${NC}\n" printf "${BLUE}Build artifacts found, skipping build. Force rebuild: FORCE_BUILD=1 bash run.sh start or bash run.sh start build${NC}\n"
fi fi
start_server start_server
echo $! > "$PID_FILE" echo $! > "$PID_FILE"
sleep 2 sleep 2
if kill -0 $(cat "$PID_FILE") 2>/dev/null; then if kill -0 $(cat "$PID_FILE") 2>/dev/null; then
printf "${GREEN}Started: http://localhost:2333${NC}\n" printf "${GREEN}Started: http://localhost:2333${NC}\n"
else else
printf "${RED}Start failed, check $LOG_FILE${NC}\n" printf "${RED}Start failed, check $LOG_FILE${NC}\n"
rm -f "$PID_FILE" rm -f "$PID_FILE"
fi fi
} }
# --- 初始?--- # --- 初始?---
if [ ! -f "todos.json" ]; then if [ ! -f "todos.json" ]; then
echo "[]" > todos.json echo "[]" > todos.json
printf "${YELLOW}已创建初始数据文?todos.json${NC}\n" printf "${YELLOW}已创建初始数据文?todos.json${NC}\n"
fi fi
# 检查包管理? # 检查包管理?
if command -v pnpm >/dev/null 2>&1; then if command -v pnpm >/dev/null 2>&1; then
PM="pnpm" PM="pnpm"
else else
PM="npm" PM="npm"
fi fi
case "$1" in case "$1" in
start) start)
do_start do_start
;; ;;
stop) stop)
do_stop do_stop
;; ;;
restart) restart)
printf "${BLUE}Restarting...${NC}\n" printf "${BLUE}Restarting...${NC}\n"
do_stop do_stop
sleep 1 sleep 1
rm -rf .next rm -rf .next
do_start do_start
;; ;;
logs) logs)
[ -f "$LOG_FILE" ] && tail -f "$LOG_FILE" || printf "${RED}Log file not found${NC}\n" [ -f "$LOG_FILE" ] && tail -f "$LOG_FILE" || printf "${RED}Log file not found${NC}\n"
;; ;;
status) status)
if [ -n "$(get_port_pids)" ]; then if [ -n "$(get_port_pids)" ]; then
printf "${GREEN}App is running${NC}\n" printf "${GREEN}App is running${NC}\n"
(command -v lsof >/dev/null 2>&1 && lsof -i:2333) || (command -v ss >/dev/null 2>&1 && ss -ltnp 'sport = :2333') || (command -v netstat >/dev/null 2>&1 && netstat -ltnp) || true (command -v lsof >/dev/null 2>&1 && lsof -i:2333) || (command -v ss >/dev/null 2>&1 && ss -ltnp 'sport = :2333') || (command -v netstat >/dev/null 2>&1 && netstat -ltnp) || true
else else
printf "${RED}App is not running${NC}\n" printf "${RED}App is not running${NC}\n"
fi fi
;; ;;
clean) clean)
printf "${BLUE}Cleaning cache and logs...${NC}\n" printf "${BLUE}Cleaning cache and logs...${NC}\n"
rm -rf .next "$LOG_FILE" "$PID_FILE" rm -rf .next "$LOG_FILE" "$PID_FILE"
printf "${GREEN}Clean complete${NC}\n" printf "${GREEN}Clean complete${NC}\n"
;; ;;
*) *)
printf "${BLUE}STARK Todo List management script${NC}\n" printf "${BLUE}STARK Todo List management script${NC}\n"
echo "Usage: $0 [start|stop|restart|logs|status|clean]" echo "Usage: $0 [start|stop|restart|logs|status|clean]"
exit 1 exit 1
;; ;;
esac esac