在 Linux 下执行程序时出现:
Text file busy
这个错误的根本原因是:你正在尝试修改或覆盖一个正在被执行的程序文件。这是由 Linux 文件系统的机制引起的 —— 你不能修改一个正被运行的可执行文件(尤其是 ELF 二进制),否则系统会报这个错误。
🧠 常见场景举例:
✅ 情景一:你运行了一个程序,然后尝试覆盖它:
./my_program & # 程序在后台运行
cp new_version ./my_program # 报错:Text file busy
✅ 情景二:脚本正被执行,你用编辑器保存时自动尝试写入
./script.sh # 正在执行
vim script.sh # 保存时会失败
✅ 解决方法(根据不同场景选择)
🅰️ 方法一:停止程序再覆盖(推荐)
ps aux | grep my_program
kill <PID> # 杀掉正在运行的程序
cp new_version ./my_program
🅱️ 方法二:重命名后替换(无停机更新技巧)
mv my_program my_program.old
cp new_version my_program
然后旧的 my_program.old
仍可继续运行,新的 my_program
可用于下一次执行。
⚠️ 注意:已有用户执行的仍是旧程序;你替换的是磁盘文件,不会影响内存中运行的程序。
🅾️ 方法三:用 lsof
查看哪个进程占用
lsof | grep my_program
可以精准看到哪个进程正在使用文件。你也可以这样:
fuser my_program
查看占用 PID,再杀掉它。
🆗 方法四:避免直接覆盖运行中的程序
设计发布策略,比如:
- 用软链接指向当前版本:
ln -s my_program_v1 my_program ./my_program # 实际执行 v1
- 发布新版后:
ln -sf my_program_v2 my_program # 切换版本
- 避免直接 cp 到运行文件。
🔧 延伸说明
- Linux 不允许写入正被执行的 ELF 文件(
exec
权限 + 正在使用) - 有些编辑器保存时是“先删除再写入”,不会触发这个错误(例如
vim
配置不同) - shell 脚本也可能出现这个问题,如果被
sh
或bash
执行中
✅ 总结
方式 | 描述 |
---|---|
停止进程再覆盖 | 最安全直接 |
重命名旧文件再复制 | 无需中断运行程序 |
lsof/fuser 查占用进程 | 精准定位 |
发布策略避免直接覆盖 | 推荐用于生产环境 |
发表回复