修3
This commit is contained in:
285
run.sh
285
run.sh
@@ -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
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user