From ed0f20b754eb3e96a6489b5fefa790339ab93856 Mon Sep 17 00:00:00 2001 From: tianmo Date: Mon, 19 Oct 2026 19:02:23 +0800 Subject: [PATCH] =?UTF-8?q?mac=E5=90=AF=E5=8A=A8=E5=81=9C=E6=AD=A2?= =?UTF-8?q?=E8=84=9A=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- start-dev.command | 58 +++++++++++++++++++++++++++++++++++++++++++++++ stop-dev.command | 45 ++++++++++++++++++++++++++++++++++++ 2 files changed, 103 insertions(+) create mode 100755 start-dev.command create mode 100755 stop-dev.command diff --git a/start-dev.command b/start-dev.command new file mode 100755 index 0000000..ffc9583 --- /dev/null +++ b/start-dev.command @@ -0,0 +1,58 @@ +#!/bin/bash +set -euo pipefail + +ROOT="$(cd "$(dirname "$0")" && pwd)" +PORT=3000 +LOG_DIR="$ROOT/logs" +LOG_FILE="$LOG_DIR/dev.log" +PID_FILE="$LOG_DIR/dev.pid" + +cd "$ROOT" + +if ! command -v node >/dev/null 2>&1; then + echo "未找到 Node.js,请先安装 Node.js 22 或更高版本。" + exit 1 +fi + +if ! command -v npm >/dev/null 2>&1; then + echo "未找到 npm,请检查 Node.js 安装。" + exit 1 +fi + +if [[ ! -d node_modules ]]; then + echo "正在安装项目依赖..." + npm ci +fi + +if [[ ! -f .env && -f .env.example ]]; then + cp .env.example .env +fi + +mkdir -p "$LOG_DIR" + +if lsof -tiTCP:"$PORT" -sTCP:LISTEN >/dev/null 2>&1; then + echo "端口 $PORT 已被占用,请先运行 stop-dev.command 或检查其他程序。" + exit 1 +fi + +echo "正在启动 PicHost..." +nohup npm run dev >"$LOG_FILE" 2>&1 & +echo $! >"$PID_FILE" + +for _ in {1..60}; do + if curl -fsS -o /dev/null "http://127.0.0.1:$PORT/" 2>/dev/null; then + echo "PicHost 已启动:http://127.0.0.1:$PORT/" + open "http://127.0.0.1:$PORT/" + exit 0 + fi + if ! kill -0 "$(cat "$PID_FILE")" 2>/dev/null; then + echo "PicHost 启动失败,最后日志:" + tail -n 40 "$LOG_FILE" 2>/dev/null || true + rm -f "$PID_FILE" + exit 1 + fi + sleep 1 +done + +echo "PicHost 启动超时,请查看日志:$LOG_FILE" +exit 1 diff --git a/stop-dev.command b/stop-dev.command new file mode 100755 index 0000000..05db5e2 --- /dev/null +++ b/stop-dev.command @@ -0,0 +1,45 @@ +#!/bin/bash +set -euo pipefail + +ROOT="$(cd "$(dirname "$0")" && pwd)" +PORT=3000 +PID_FILE="$ROOT/logs/dev.pid" + +cd "$ROOT" + +PIDS="$(lsof -tiTCP:"$PORT" -sTCP:LISTEN 2>/dev/null || true)" +if [[ -z "$PIDS" ]]; then + rm -f "$PID_FILE" + echo "PicHost 未运行。" + exit 0 +fi + +for pid in $PIDS; do + command_line="$(ps -o command= -p "$pid" 2>/dev/null || true)" + cwd="$(lsof -a -p "$pid" -d cwd -Fn 2>/dev/null | sed -n 's/^n//p' | head -n 1)" + if [[ "$command_line" != *"$ROOT"* && "$cwd" != "$ROOT" ]]; then + echo "端口 $PORT 属于其他程序,已取消停止。" + exit 1 + fi + kill "$pid" 2>/dev/null || true +done + +for _ in {1..20}; do + if ! lsof -tiTCP:"$PORT" -sTCP:LISTEN >/dev/null 2>&1; then + break + fi + sleep 0.5 +done + +if lsof -tiTCP:"$PORT" -sTCP:LISTEN >/dev/null 2>&1; then + for pid in $(lsof -tiTCP:"$PORT" -sTCP:LISTEN 2>/dev/null || true); do + kill -9 "$pid" 2>/dev/null || true + done +fi + +if [[ -f "$PID_FILE" ]]; then + kill "$(cat "$PID_FILE")" 2>/dev/null || true + rm -f "$PID_FILE" +fi + +echo "PicHost 已停止。"