Watch at Ease看见世界,读懂生活。

Technology · 实用指南

Linux 提示“Text file busy”?替换前先证明可执行文件的所有者

ETXTBSY 是写入与执行冲突,不是 chmod 提示。记录路径和 inode,找出执行方与写入方,单独暂存候选文件,再分别验证路径切换与服务重启。

原创示意图: Linux 提示“Text file busy”?替换前先证明可执行文件的所有者 — path and inode evidence
原创示意图: 变更前记录路径、解析路径、设备、inode、权限、所有者、摘要和相关进程。 Watch at Ease

在 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 已解释、异常可写描述符已消失、新启动使用目标文件且真实验收通过时才关闭事件;不确定性应保留为阻塞。

原创示意图: Linux 提示“Text file busy”?替换前先证明可执行文件的所有者 — replacement and restart boundary
原创示意图: 切换后核对新 PID、可执行文件身份、版本、健康、日志和回滚。 Watch at Ease