Technology · 實用指南
Linux 顯示「Text file busy」?替換前先證明可執行檔的擁有者
ETXTBSY 是寫入與執行衝突,不是 chmod 提示。記錄路徑與 inode,找出執行方與寫入方,另行暫存候選檔,再分別驗證路徑切換與服務重啟。

在 Linux 上,「Text file busy」(ETXTBSY)通常表示有人正嘗試寫入正在執行的映像,或執行一個仍被其他程序以可寫方式開啟的檔案。盲目重試、chmod 或原地複製只會掩蓋擁有權衝突。
先保留精確路徑、裝置號與 inode,識別執行程序與可寫描述元,再由部署擁有者暫存並驗證獨立候選檔。同檔案系統 rename 只能切換一個路徑;舊程序仍執行舊映像,完整應用升級與重啟仍須另外驗證。
停止把 ETXTBSY 當成 chmod 問題
錯誤描述寫入與執行關係,不是缺少執行位元。保留失敗命令與 errno,判斷是部署器覆寫活動二進位檔,還是新檔仍有繼承的可寫描述元。
不要為了清除訊息而刪除、強制複製或反覆重試正式檔案。先明確目標是原地寫入、首次執行或受控替換。
證明路徑、inode 與兩個擁有者
用 readlink、stat、file 與 sha256sum 記錄目標身分,再用核准的程序清單、fuser 或 lsof 找出執行者與寫入者。rename 後相同路徑可能指向不同 inode。
同時記錄 systemd、容器、主管程序或套件管理器等生命週期擁有者。NFS、共享目錄與 overlay 必須視為獨立邊界。
區分執行映像衝突與可寫描述元競態
一種情況是舊程序正在執行部署器要重寫的 inode;另一種是 fork 繼承新檔的可寫描述元,導致 execve 仍看到寫入者。Rust 專案問題完整重現第二種競態。
sleep 或重試只會改變時序。長久修復應明確描述元擁有權與寫入到執行的交接,或使用獨立候選並由部署擁有者切換。
暫存獨立候選並有意切換一個路徑
在目標目錄或同一檔案系統的驗證位置寫入新檔,檢查摘要、類型、權限、擁有者及必要簽章或來源。不要只憑傳輸摘要執行不受信任的下載。
rename(2) 對單一目錄項目的替換是原子的,舊開啟描述元不受影響。這不是跨檔案系統、網路儲存、動態函式庫、遷移或多檔發布的通用交易。
重啟、驗證並結束事件
切換後,舊程序可能繼續執行舊 inode。由服務擁有者滾動或重啟,再核對新 PID、身分、版本、健康、日誌與相依性。
只有原 ETXTBSY 已解釋、異常可寫描述元消失、新啟動使用目標檔且真實驗收通過時才結束事件;不確定性應保留為阻塞。
