@coze-arch/cli 0.0.36-alpha.b20d2b → 0.0.36-alpha.d38260

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -44,14 +44,41 @@ LOG_DIR="${COZE_LOG_DIR:-${COZE_WORKSPACE_PATH}/logs}"
44
44
  LOG_FILE="${LOG_DIR}/server.log"
45
45
  PID_FILE="${LOG_DIR}/server.pid"
46
46
 
47
+ # detached 出去的进程没人负责回收,超过这个时长就自己退出,避免端口与内存长期泄露。
48
+ MAX_RUNTIME_SECONDS=1200
49
+
50
+ # 真正被 detach 的是这层 bash wrapper:它是进程组 leader,组内 watchdog 到点回收整组
51
+ # (wrapper -> pnpm -> nuxt -> node);被包的进程自己先退出时也顺手清空进程组,不留残余。
52
+ RUN_WITH_TIMEOUT='
53
+ timeout_seconds=$1
54
+ shift
55
+
56
+ "$@" &
57
+ child_pid=$!
58
+
59
+ # 先忽略 TERM,才能在向整组发 TERM(自己也在组里)之后存活下来补一发 KILL。
60
+ ( trap "" TERM
61
+ sleep "${timeout_seconds}"
62
+ echo "[dev] 后台进程运行超过 ${timeout_seconds}s,回收进程组 $$。"
63
+ kill -TERM -- "-$$" 2>/dev/null || true
64
+ sleep 5
65
+ kill -KILL -- "-$$" 2>/dev/null || true
66
+ ) &
67
+
68
+ wait "${child_pid}"
69
+ kill -KILL -- "-$$" 2>/dev/null || true
70
+ '
71
+
47
72
  # coze-daemon 会在 runtime shell 退出时清理原进程组。
48
73
  # 通过 Node detached spawn 创建独立 session/进程组,并将 stdio 直接写入日志。
74
+ # 返回的 PID 是 wrapper 的,同时也是整个进程组的 PGID,后续按组回收。
49
75
  spawn_detached() {
50
76
  local cwd="$1"
51
77
  local log_file="$2"
52
78
  shift 2
53
79
 
54
- node - "$cwd" "$log_file" "$@" <<'NODE'
80
+ node - "$cwd" "$log_file" \
81
+ /bin/bash -c "${RUN_WITH_TIMEOUT}" detached-runner "${MAX_RUNTIME_SECONDS}" "$@" <<'NODE'
55
82
  const fs = require('node:fs');
56
83
  const { spawn } = require('node:child_process');
57
84
 
@@ -115,6 +142,7 @@ if [[ -z "${server_pid}" ]] || ! kill -0 "${server_pid}" 2>/dev/null; then
115
142
  fi
116
143
 
117
144
  echo "Dev server started (PID: ${server_pid})."
145
+ echo "Auto stop after ${MAX_RUNTIME_SECONDS}s."
118
146
  echo "Log file: ${LOG_FILE}"
119
147
  echo "PID file: ${PID_FILE}"
120
148
  <% } %>
@@ -30,14 +30,41 @@ kill_process_tree() {
30
30
  fi
31
31
  }
32
32
 
33
+ # detached 出去的进程没人负责回收,超过这个时长就自己退出,避免端口与内存长期泄露。
34
+ MAX_RUNTIME_SECONDS=1200
35
+
36
+ # 真正被 detach 的是这层 bash wrapper:它是进程组 leader,组内 watchdog 到点回收整组
37
+ # (wrapper -> pnpm -> taro/nest);被包的进程自己先退出时也顺手清空进程组,不留残余。
38
+ RUN_WITH_TIMEOUT='
39
+ timeout_seconds=$1
40
+ shift
41
+
42
+ "$@" &
43
+ child_pid=$!
44
+
45
+ # 先忽略 TERM,才能在向整组发 TERM(自己也在组里)之后存活下来补一发 KILL。
46
+ ( trap "" TERM
47
+ sleep "${timeout_seconds}"
48
+ echo "[dev] 后台进程运行超过 ${timeout_seconds}s,回收进程组 $$。"
49
+ kill -TERM -- "-$$" 2>/dev/null || true
50
+ sleep 5
51
+ kill -KILL -- "-$$" 2>/dev/null || true
52
+ ) &
53
+
54
+ wait "${child_pid}"
55
+ kill -KILL -- "-$$" 2>/dev/null || true
56
+ '
57
+
33
58
  # coze-daemon 会在 runtime shell 退出时清理原进程组。
34
59
  # 通过 Node detached spawn 创建独立 session/进程组,并将 stdio 直接写入日志。
60
+ # 返回的 PID 是 wrapper 的,同时也是整个进程组的 PGID,后续按组回收。
35
61
  spawn_detached() {
36
62
  local cwd="$1"
37
63
  local log_file="$2"
38
64
  shift 2
39
65
 
40
- node - "$cwd" "$log_file" "$@" <<'NODE'
66
+ node - "$cwd" "$log_file" \
67
+ /bin/bash -c "${RUN_WITH_TIMEOUT}" detached-runner "${MAX_RUNTIME_SECONDS}" "$@" <<'NODE'
41
68
  const fs = require('node:fs');
42
69
  const { spawn } = require('node:child_process');
43
70
 
@@ -225,6 +252,7 @@ start_service() {
225
252
  fi
226
253
 
227
254
  echo "📝 Dev process started with PID: ${DEV_PID}"
255
+ echo "Auto stop after ${MAX_RUNTIME_SECONDS}s."
228
256
  echo "Log file: ${LOG_FILE}"
229
257
  echo "PID file: ${PID_FILE}"
230
258
  }
@@ -44,14 +44,41 @@ LOG_DIR="${COZE_LOG_DIR:-${COZE_WORKSPACE_PATH}/logs}"
44
44
  LOG_FILE="${LOG_DIR}/server.log"
45
45
  PID_FILE="${LOG_DIR}/server.pid"
46
46
 
47
+ # detached 出去的进程没人负责回收,超过这个时长就自己退出,避免端口与内存长期泄露。
48
+ MAX_RUNTIME_SECONDS=1200
49
+
50
+ # 真正被 detach 的是这层 bash wrapper:它是进程组 leader,组内 watchdog 到点回收整组
51
+ # (wrapper -> pnpm -> tsx -> node);被包的进程自己先退出时也顺手清空进程组,不留残余。
52
+ RUN_WITH_TIMEOUT='
53
+ timeout_seconds=$1
54
+ shift
55
+
56
+ "$@" &
57
+ child_pid=$!
58
+
59
+ # 先忽略 TERM,才能在向整组发 TERM(自己也在组里)之后存活下来补一发 KILL。
60
+ ( trap "" TERM
61
+ sleep "${timeout_seconds}"
62
+ echo "[dev] 后台进程运行超过 ${timeout_seconds}s,回收进程组 $$。"
63
+ kill -TERM -- "-$$" 2>/dev/null || true
64
+ sleep 5
65
+ kill -KILL -- "-$$" 2>/dev/null || true
66
+ ) &
67
+
68
+ wait "${child_pid}"
69
+ kill -KILL -- "-$$" 2>/dev/null || true
70
+ '
71
+
47
72
  # coze-daemon 会在 runtime shell 退出时清理原进程组。
48
73
  # 通过 Node detached spawn 创建独立 session/进程组,并将 stdio 直接写入日志。
74
+ # 返回的 PID 是 wrapper 的,同时也是整个进程组的 PGID,后续按组回收。
49
75
  spawn_detached() {
50
76
  local cwd="$1"
51
77
  local log_file="$2"
52
78
  shift 2
53
79
 
54
- node - "$cwd" "$log_file" "$@" <<'NODE'
80
+ node - "$cwd" "$log_file" \
81
+ /bin/bash -c "${RUN_WITH_TIMEOUT}" detached-runner "${MAX_RUNTIME_SECONDS}" "$@" <<'NODE'
55
82
  const fs = require('node:fs');
56
83
  const { spawn } = require('node:child_process');
57
84
 
@@ -115,6 +142,7 @@ if [[ -z "${server_pid}" ]] || ! kill -0 "${server_pid}" 2>/dev/null; then
115
142
  fi
116
143
 
117
144
  echo "Dev server started (PID: ${server_pid})."
145
+ echo "Auto stop after ${MAX_RUNTIME_SECONDS}s."
118
146
  echo "Log file: ${LOG_FILE}"
119
147
  echo "PID file: ${PID_FILE}"
120
148
  <% } %>