在 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 查占用进程精准定位
发布策略避免直接覆盖推荐用于生产环境