修3
Some checks failed
CI / lint (push) Has been cancelled
CI / build (push) Has been cancelled

This commit is contained in:
2026-02-27 11:59:53 +08:00
parent 622908cbad
commit c85bf31d99

285
run.sh
View File

@@ -1,134 +1,151 @@
#!/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]\+\).*//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]\+\)\/.*//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 ' ' ' fuser -n tcp 2333 2>/dev/null | tr ' ' '\n' | sort -u
' | sort -u fi
fi }
}
prepare_standalone() {
# --- 逻辑封装 --- if [ -f ".next/standalone/server.js" ]; then
rm -rf .next/standalone/.next .next/standalone/public
function do_stop() { mkdir -p .next/standalone/.next
printf "${YELLOW}正在停止 STARK Todo List...${NC}\n" [ -d .next/static ] && cp -r .next/static .next/standalone/.next/
[ -d public ] && cp -r public .next/standalone/
# 1. 首先尝试通过 PID 文件停止 fi
if [ -f "$PID_FILE" ]; then }
PID=$(cat "$PID_FILE")
pkill -P $PID >/dev/null 2>&1 start_server() {
kill $PID >/dev/null 2>&1 if [ -f ".next/standalone/server.js" ]; then
rm "$PID_FILE" NODE_ENV=production PORT=2333 nohup node .next/standalone/server.js > "$LOG_FILE" 2>&1 &
fi else
NODE_ENV=production nohup $PM run start > "$LOG_FILE" 2>&1 &
# 2. 强力兜底查找并杀死占<E6ADBB><E58DA0>?2333 端口的所<E79A84><E68980>?Node 进程 fi
PORT_PIDS=$(get_port_pids) }
if [ -n "$PORT_PIDS" ]; then
for P in $PORT_PIDS; do # --- 逻辑封装 ---
kill -9 $P >/dev/null 2>&1
done function do_stop() {
fi printf "${YELLOW}正在停止 STARK Todo List...${NC}\n"
printf "${YELLOW}已停止所有相关进程并释放端口<EFBFBD><EFBFBD>?{NC}\n"
} # 1. 首先尝试通过 PID 文件停止
if [ -f "$PID_FILE" ]; then
function do_start() { PID=$(cat "$PID_FILE")
if [ -f "$PID_FILE" ] && kill -0 $(cat "$PID_FILE") 2>/dev/null; then pkill -P $PID >/dev/null 2>&1
printf "${YELLOW}应用已经在运行中 (PID: $(cat $PID_FILE))${NC}\n" kill $PID >/dev/null 2>&1
return 0 rm "$PID_FILE"
fi fi
PORT_PID=$(get_port_pids) # 2. 强力兜底:查找并杀死占?2333 端口的所?Node 进程
if [ -n "$PORT_PID" ]; then PORT_PIDS=$(get_port_pids)
printf "${YELLOW}?? 2333 ??????????????...${NC}\n" if [ -n "$PORT_PIDS" ]; then
do_stop for P in $PORT_PIDS; do
sleep 1 kill -9 $P >/dev/null 2>&1
PORT_PID=$(get_port_pids) done
if [ -n "$PORT_PID" ]; then fi
printf "${RED}??: ?? 2333 ?????????????????${NC}\n" printf "${YELLOW}已停止所有相关进程并释放端口?{NC}\n"
return 1 }
fi
fi function do_start() {
if [ -f "$PID_FILE" ] && kill -0 $(cat "$PID_FILE") 2>/dev/null; then
printf "${GREEN}?? $PM ?? STARK Todo List (production)...${NC}\n" printf "${YELLOW}应用已经在运行中 (PID: $(cat $PID_FILE))${NC}\n"
# 抑制安装输出保持界面整<E99DA2><E695B4>? $PM install > /dev/null 2>&1 return 0
fi
$PM run build > /dev/null 2>&1
PORT_PID=$(get_port_pids)
NODE_ENV=production nohup $PM run start > "$LOG_FILE" 2>&1 & if [ -n "$PORT_PID" ]; then
echo $! > "$PID_FILE" printf "${YELLOW}?? 2333 ??????????????...${NC}\n"
do_stop
sleep 2 sleep 1
if kill -0 $(cat "$PID_FILE") 2>/dev/null; then PORT_PID=$(get_port_pids)
printf "${GREEN}启动成功访<EFBFBD><EFBFBD>? http://localhost:2333${NC}\n" if [ -n "$PORT_PID" ]; then
else printf "${RED}??: ?? 2333 ?????????????????${NC}\n"
printf "${RED}启动失败,请查看 $LOG_FILE${NC}\n" return 1
rm -f "$PID_FILE" fi
fi fi
}
printf "${GREEN}?? $PM ?? STARK Todo List (production)...${NC}\n"
# --- 初始<E5889D><E5A78B>?--- # 抑制安装输出,保持界面整? $PM install > /dev/null 2>&1
if [ ! -f "todos.json" ]; then
echo "[]" > todos.json $PM run build > /dev/null 2>&1
printf "${YELLOW}已创建初始数据文<EFBFBD><EFBFBD>?todos.json${NC}\n" prepare_standalone
fi
start_server
# 检查包管理<E7AEA1><E79086>? echo $! > "$PID_FILE"
if command -v pnpm >/dev/null 2>&1; then
PM="pnpm" sleep 2
else if kill -0 $(cat "$PID_FILE") 2>/dev/null; then
PM="npm" printf "${GREEN}启动成功!访? http://localhost:2333${NC}\n"
fi else
printf "${RED}启动失败,请查看 $LOG_FILE${NC}\n"
case "$1" in rm -f "$PID_FILE"
start) fi
do_start }
;;
stop) # --- 初始?---
do_stop if [ ! -f "todos.json" ]; then
;; echo "[]" > todos.json
restart) printf "${YELLOW}已创建初始数据文?todos.json${NC}\n"
printf "${BLUE}正在执行彻底重启...${NC}\n" fi
do_stop
sleep 1 # 检查包管理?
rm -rf .next if command -v pnpm >/dev/null 2>&1; then
do_start PM="pnpm"
;; else
logs) PM="npm"
[ -f "$LOG_FILE" ] && tail -f "$LOG_FILE" || printf "${RED}日志文件不存<EFBFBD><EFBFBD>?{NC}\n" fi
;;
status) case "$1" in
if [ -n "$(get_port_pids)" ]; then start)
printf "${GREEN}应用正在运行${NC}\n" do_start
(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 stop)
printf "${RED}应用未运<EFBFBD><EFBFBD>?{NC}\n" do_stop
fi ;;
;; restart)
clean) printf "${BLUE}正在执行彻底重启...${NC}\n"
printf "${BLUE}清理缓存和日<EFBFBD><EFBFBD>?..${NC}\n" do_stop
rm -rf .next "$LOG_FILE" "$PID_FILE" sleep 1
printf "${GREEN}清理完成${NC}\n" rm -rf .next
;; do_start
*) ;;
printf "${BLUE}STARK Todo List 本地管理脚本${NC}\n" logs)
echo "用法: $0 [start|stop|restart|logs|status|clean]" [ -f "$LOG_FILE" ] && tail -f "$LOG_FILE" || printf "${RED}日志文件不存?{NC}\n"
exit 1 ;;
;; status)
esac if [ -n "$(get_port_pids)" ]; then
printf "${GREEN}应用正在运行${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
else
printf "${RED}应用未运?{NC}\n"
fi
;;
clean)
printf "${BLUE}清理缓存和日?..${NC}\n"
rm -rf .next "$LOG_FILE" "$PID_FILE"
printf "${GREEN}清理完成${NC}\n"
;;
*)
printf "${BLUE}STARK Todo List 本地管理脚本${NC}\n"
echo "用法: $0 [start|stop|restart|logs|status|clean]"
exit 1
;;
esac