From 43ac9a6d1054faf1b8b37d56339a3f6238a60c0e Mon Sep 17 00:00:00 2001 From: zerosaturation Date: Mon, 13 Apr 2026 16:11:17 +0800 Subject: [PATCH] =?UTF-8?q?faet:=20=E6=96=B0=E5=A2=9E=E4=B8=80=E4=B8=AA?= =?UTF-8?q?=E5=BC=80=E5=8F=91=E7=8E=AF=E5=A2=83=E7=9A=84=E7=83=AD=E6=9B=B4?= =?UTF-8?q?=E6=96=B0=E8=84=9A=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- backend/dev.sh | 51 ++++++++++++++++++++++++++++++++++++++++++++------ 1 file changed, 45 insertions(+), 6 deletions(-) diff --git a/backend/dev.sh b/backend/dev.sh index 193db2e..7d3f1d8 100755 --- a/backend/dev.sh +++ b/backend/dev.sh @@ -23,7 +23,7 @@ cleanup() { # 清理所有 PID 文件并杀服务进程 for service in gateway activityService galleryService socialService assetService userService; do pkill -9 -f "$service" 2>/dev/null || true - rm -f "/tmp/dev_sh_${service}.pid" "/tmp/dev_sh_${service}_restart" + rm -f "/tmp/dev_sh_${service}.pid" "/tmp/dev_sh_${service}_restart" "/tmp/dev_sh_${service}.lock" echo -e "${YELLOW} 🛑 $service 已停止${NC}" done @@ -140,6 +140,13 @@ restart_service() { local port=$4 local use_db=$5 local pid_file="/tmp/dev_sh_${name}.pid" + local lock_file="/tmp/dev_sh_${name}.lock" + + # 加锁防止并发重启 + if [ -f "$lock_file" ]; then + return 0 + fi + touch "$lock_file" # Step 1: 编译(先编译,编译成功才杀旧进程) if [ ! -d "$SCRIPT_DIR/$dir" ]; then @@ -182,6 +189,9 @@ restart_service() { else echo -e "${RED}❌ [$name] 重启失败,查看日志: tail -f /tmp/${name}.log${NC}" fi + + # 解锁 + rm -f "$lock_file" } # 启动文件监听器 @@ -205,12 +215,36 @@ start_watcher() { ( if [[ "$(uname)" == "Darwin" ]]; then - fswatch -r "$watch_path" --exclude='\.git' --exclude='_test\.go$' + # 排除: .git目录, 测试文件, 二进制文件(无扩展名), .exe, bin/目录 + fswatch -r "$watch_path" \ + --exclude='\.git' \ + --exclude='_test\.go$' \ + --exclude='\.exe$' \ + --exclude='gateway$' \ + --exclude='userService$' \ + --exclude='assetService$' \ + --exclude='socialService$' \ + --exclude='galleryService$' \ + --exclude='activityService$' else - inotifywait -r -m -e modify,create,write "$watch_path" --exclude='\.git' --exclude='_test\.go$' + inotifywait -r -m -e modify,create,write "$watch_path" \ + --exclude='\.git' \ + --exclude='_test\.go$' \ + --exclude='\.exe$' \ + --exclude='gateway$' \ + --exclude='userService$' \ + --exclude='assetService$' \ + --exclude='socialService$' \ + --exclude='galleryService$' \ + --exclude='activityService$' fi | while read event; do # 时间戳防抖:每次事件更新标记文件 - date +%s%N > "$restart_marker" + # Darwin 不支持 date +%s%N,使用 python 获取纳秒时间戳 + if [[ "$(uname)" == "Darwin" ]]; then + python3 -c 'import time; print(int(time.time()*1e9))' > "$restart_marker" + else + date +%s%N > "$restart_marker" + fi done ) & local watcher_pid=$! @@ -224,10 +258,15 @@ start_watcher() { if [ ! -f "$restart_marker" ]; then continue fi - local now=$(date +%s%N) + local now + if [[ "$(uname)" == "Darwin" ]]; then + now=$(python3 -c 'import time; print(int(time.time()*1e9))') + else + now=$(date +%s%N) + fi local last_time=$(cat "$restart_marker" 2>/dev/null || echo 0) local elapsed=$((now - last_time)) - if (( elapsed >= 300000000 )); then + if (( elapsed >= 500000000 )); then # 距上次事件已过 300ms,执行重启 rm -f "$restart_marker" restart_service "$name" "$dir" "$binary" "$port" "$use_db"