科技 · 实用指南
Linux 报“getcwd() failed”?重启前先证明工作目录已被解除链接
同名新目录不是进程仍持有的旧目录。先保存调用者证据,再离开失效 cwd、明确重入并追查删除者。

同名新目录不是进程仍持有的旧目录。先保存调用者证据,再离开失效 cwd、明确重入并追查删除者。
当前工作目录被解除链接时,Linux getcwd 返回 ENOENT。 路径项消失后,进程仍可持有目录对象。
1. 改变目录前保存失败调用者
保存准确命令、完整错误、PID、父进程、用户、shell 或服务、容器或挂载命名空间,以及提示符或环境显示的工作目录文本。新 shell 成功不能代表原调用者。
不要先重启服务或递归清理;这些操作会销毁区分“仍打开但已解除链接的目录对象”、缺失挂载、不可访问父目录和应用错误的证据。
2. 证明路径失败与对象身份
在受影响 shell 记录 pwd -P 与 cd . 的输出。Linux 的 getcwd 在当前工作目录被解除链接时返回 ENOENT;获准时检查 /proc/PID/cwd,deleted 标记可支持该判断。
把进程视图与当前同名路径比较。相同文本下重建的目录是另一个对象;可用时记录 stat 标识、挂载与命名空间,不能因路径字符串相同就认定连续。
3. 进入已知存在的目录恢复
cd -- 到已验证的绝对路径,例如服务账号 home 或工作区父目录,再确认 pwd -P 成功。这只修复调用者上下文,不解释旧目录为何消失。
对服务、调度器或构建 worker,应先保存证据,再修改配置工作目录或重启。若目标挂载缺失,先在同一命名空间恢复挂载,不要在挂载点随手创建本地目录。
4. 明确重入目标路径
从部署或服务配置确定权威目标,再显式进入。恢复写入前核对所有者、权限、挂载源与对象身份;不要把旧 PWD 或 OLDPWD 当成存活证据。
在同一调用上下文重跑原命令。确认目标后才能测试相对路径写入;若出现同名替代目录,要把它当作独立对象审查内容与所有权。
5. 追查删除者并防止复发
追查谁删除、重命名、替换或卸载目录:部署切换、清理任务、临时目录策略、包钩子、容器销毁和人工维护都是候选类别。关联日志与文件系统事件,不要仅凭 getcwd 错误下结论。
让部署在替换树前迁出调用者,为服务设置稳定工作目录,协调挂载生命周期并排除正在使用的工作区。记录失效对象证据、恢复路径、责任来源和同上下文成功验证。
