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