修三支閘的戳記釋放在 Linux 永遠失效:stat -c %Y 要排在 stat -f %m 前面
三支閘的 stamp_ok/退回機制都用 `stat -f %m … || stat -c %Y …` 取 mtime。 GNU (Linux) 的 `stat -f` 是 --file-system,%m 被當成檔名 ⇒ 把整張檔案系統表印到 stdout(被 $() 收進去)且 exit 1 ⇒ MT 變非數字 ⇒ case *[!0-9]* 命中 ⇒ 釋放章永遠失效。 dev 在 macOS(BSD `-f %m` 正常)所以本機測不出來,一到雲端 Linux 就咬。 實際後果(2026-08-23 雲端 cloud-worker 實撞): - prod-write-guard:總管 touch /tmp/.prod-write-ok 也放行不了 ⇒ routine 的心跳打不出去 - main-and-prod-push-guard:arm 章在 Linux 形同虛設 - stage-before-prod-guard:stage 已驗的退回機制失效 改法:GNU 先、BSD 後(stat -c %Y … || stat -f %m …),兩平台都正確。 驗證(Linux):抽出 patched stamp_ok 實跑—— 新戳記→rc=0(釋放、單次消耗)/無戳記→rc=1(擋)/逾時>900s→rc=1(過期)。 反證:舊順序帶新戳記→rc=2(確認舊版在 Linux 是壞的)。
This commit is contained in:
@@ -52,7 +52,11 @@ STAMP="/tmp/.prod-write-ok"
|
||||
stamp_ok() {
|
||||
[ -f "$STAMP" ] || return 1
|
||||
NOW=$(date +%s 2>/dev/null || echo 0)
|
||||
MT=$(stat -f %m "$STAMP" 2>/dev/null || stat -c %Y "$STAMP" 2>/dev/null || echo 0)
|
||||
# 🔴 GNU (Linux) 先、BSD (macOS) 後——順序反了戳記在雲端永遠失效:
|
||||
# GNU 的 `stat -f` 是 --file-system,`%m` 被當成檔名 ⇒ 把整張檔案系統表印到
|
||||
# stdout(被 $() 收進去)且 exit 1 ⇒ MT 變非數字 ⇒ 這道閘的釋放章在 Linux 永不生效。
|
||||
# dev 在 macOS(BSD `-f %m` 正常)所以沒被抓到,一到雲端 Linux 就咬(實測 2026-08-23)。
|
||||
MT=$(stat -c %Y "$STAMP" 2>/dev/null || stat -f %m "$STAMP" 2>/dev/null || echo 0)
|
||||
case "$NOW$MT" in *[!0-9]*) return 1 ;; esac
|
||||
[ "$NOW" -gt 0 ] && [ "$MT" -gt 0 ] || return 1
|
||||
[ $((NOW - MT)) -lt 900 ] || return 1
|
||||
|
||||
Reference in New Issue
Block a user