科技 · 實用指南
Linux 顯示「getcwd() failed」?重啟前先證明 working directory 已 unlink
同名新 directory 不是 process 仍持有的舊 object;先保留 caller,再離開 stale cwd、重新進入並追查移除者。

同名新 directory 不是 process 仍持有的舊 object;先保留 caller,再離開 stale cwd、重新進入並追查移除者。
cwd 已 unlink 時 Linux getcwd 回傳 ENOENT。 pathname entry 消失後 process 仍可持有 object。
1. 先保存 failing caller
保存 command、完整 error、PID、parent、user、shell/service、container 或 mount namespace,以及 prompt/PWD 顯示的文字。新 shell 成功不能代表 original caller。
不要先 restart 或 recursive cleanup,否則會破壞區分 unlinked cwd、missing mount、parent access 與 application failure 的證據。
2. 證明 pathname 與 object identity
在 affected shell 記錄 pwd -P 與 cd .。Linux getcwd 在 cwd 已 unlink 時回傳 ENOENT;允許時檢查 /proc/PID/cwd,deleted marker 可支持判斷。
比較 process view 與目前 pathname。同名重建的 directory 是不同 object;記錄 stat identity、mount 與 namespace,不能只比字串。
3. 進入已知 live directory
cd -- 到 verified absolute path 並確認 pwd -P。這只修復 caller context,不會解釋舊 directory 為何消失。
service、scheduler 或 worker 要先保存 evidence,再改 working directory 或 restart;missing mount 要在同 namespace 恢復,不要在 mountpoint 建替代 local directory。
4. 明確重新進入 target
從 deployment/service config 取得 authoritative path,再明確 cd;恢復寫入前核對 owner、permissions、mount source 與 identity。
在同 caller context 重跑 original command;same-name replacement 必須當作另一個 directory 審查。
5. 追查 owner 並避免復發
追查 deployment swap、cleanup job、tmp policy、package hook、container teardown 或 manual maintenance,並比對 logs/events。
替換 tree 前先讓 callers 離開、給 service stable cwd、協調 mount lifecycle,並記錄 evidence、recovery 與成功驗證。
