cron 环境 PATH 不含 nvm 目录,nohup node 找不到命令导致服务一直拉不起来 (HTTP=000)。改用 $HOME/.nvm/.../bin/node 绝对路径,模拟 cron 最小环境 验证可正常拉起。
56 lines
1.9 KiB
Bash
Executable File
56 lines
1.9 KiB
Bash
Executable File
#!/bash
|
|
# data-chart-tool 保活脚本
|
|
# 检查服务是否运行,如果没有则启动
|
|
|
|
PORT=16016
|
|
APP_DIR="/home/openclaw/.openclaw/workspace-hz4th_coder/works/data-chart-tool"
|
|
LOG_FILE="$APP_DIR/logs/server.log"
|
|
|
|
# node 绝对路径(cron 环境 PATH 不含 nvm,必须用全路径)
|
|
NODE_BIN="$HOME/.nvm/versions/node/v24.15.0/bin/node"
|
|
if [ ! -x "$NODE_BIN" ]; then
|
|
NODE_BIN="$(command -v node 2>/dev/null)"
|
|
fi
|
|
|
|
# 检查端口是否被占用
|
|
if ss -tlnp | grep -q ":$PORT "; then
|
|
# 检查是不是 node 进程
|
|
PID=$(ss -tlnp | grep ":$PORT " | grep -oP 'pid=\K[0-9]+' | head -1)
|
|
if [ -n "$PID" ]; then
|
|
CMD=$(ps -p "$PID" -o comm= 2>/dev/null)
|
|
if [ "$CMD" = "node" ] || [ "$CMD" = "MainThread" ]; then
|
|
# node 服务在运行,检查是否正常响应
|
|
HTTP_CODE=$(curl -s -o /dev/null -w "%{http_code}" http://localhost:$PORT/api/health 2>/dev/null)
|
|
if [ "$HTTP_CODE" = "200" ]; then
|
|
echo "[$(date)] Service OK (PID=$PID, HTTP=$HTTP_CODE)"
|
|
exit 0
|
|
fi
|
|
fi
|
|
# 端口被非 node 进程占用(如 Python http.server),杀掉它
|
|
echo "[$(date)] Port $PORT occupied by $CMD (PID=$PID), killing..."
|
|
kill -9 "$PID" 2>/dev/null
|
|
sleep 1
|
|
fi
|
|
fi
|
|
|
|
# 启动 node 服务
|
|
if [ -z "$NODE_BIN" ] || [ ! -x "$NODE_BIN" ]; then
|
|
echo "[$(date)] ERROR: node 未找到,无法启动"
|
|
exit 1
|
|
fi
|
|
echo "[$(date)] Starting data-chart-tool..."
|
|
cd "$APP_DIR"
|
|
nohup "$NODE_BIN" server.js >> "$LOG_FILE" 2>&1 &
|
|
echo "[$(date)] Started with PID $!"
|
|
|
|
# 等待启动
|
|
sleep 2
|
|
|
|
# 验证
|
|
HTTP_CODE=$(curl -s -o /dev/null -w "%{http_code}" http://localhost:$PORT/api/health 2>/dev/null)
|
|
if [ "$HTTP_CODE" = "200" ]; then
|
|
echo "[$(date)] Service started successfully (HTTP=$HTTP_CODE)"
|
|
else
|
|
echo "[$(date)] WARNING: Service may not have started correctly (HTTP=$HTTP_CODE)"
|
|
fi
|