faet: 新增一个开发环境的热更新脚本

This commit is contained in:
zerosaturation 2026-04-13 16:11:17 +08:00
parent 4b817b320c
commit 43ac9a6d10

View File

@ -23,7 +23,7 @@ cleanup() {
# 清理所有 PID 文件并杀服务进程 # 清理所有 PID 文件并杀服务进程
for service in gateway activityService galleryService socialService assetService userService; do for service in gateway activityService galleryService socialService assetService userService; do
pkill -9 -f "$service" 2>/dev/null || true 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}" echo -e "${YELLOW} 🛑 $service 已停止${NC}"
done done
@ -140,6 +140,13 @@ restart_service() {
local port=$4 local port=$4
local use_db=$5 local use_db=$5
local pid_file="/tmp/dev_sh_${name}.pid" 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: 编译(先编译,编译成功才杀旧进程) # Step 1: 编译(先编译,编译成功才杀旧进程)
if [ ! -d "$SCRIPT_DIR/$dir" ]; then if [ ! -d "$SCRIPT_DIR/$dir" ]; then
@ -182,6 +189,9 @@ restart_service() {
else else
echo -e "${RED}❌ [$name] 重启失败,查看日志: tail -f /tmp/${name}.log${NC}" echo -e "${RED}❌ [$name] 重启失败,查看日志: tail -f /tmp/${name}.log${NC}"
fi fi
# 解锁
rm -f "$lock_file"
} }
# 启动文件监听器 # 启动文件监听器
@ -205,12 +215,36 @@ start_watcher() {
( (
if [[ "$(uname)" == "Darwin" ]]; then 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 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 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 done
) & ) &
local watcher_pid=$! local watcher_pid=$!
@ -224,10 +258,15 @@ start_watcher() {
if [ ! -f "$restart_marker" ]; then if [ ! -f "$restart_marker" ]; then
continue continue
fi 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 last_time=$(cat "$restart_marker" 2>/dev/null || echo 0)
local elapsed=$((now - last_time)) local elapsed=$((now - last_time))
if (( elapsed >= 300000000 )); then if (( elapsed >= 500000000 )); then
# 距上次事件已过 300ms执行重启 # 距上次事件已过 300ms执行重启
rm -f "$restart_marker" rm -f "$restart_marker"
restart_service "$name" "$dir" "$binary" "$port" "$use_db" restart_service "$name" "$dir" "$binary" "$port" "$use_db"