/usr/bin/perl: 坏的解释器:文本文件繁忙

34

这对我来说很新鲜:这个错误表示什么?

  /usr/bin/perl: bad interpreter: Text file busy

当时有一些磁盘密集型进程正在运行,但我以前从未见过这个消息 - 实际上,这是我记得尝试运行Perl脚本时第一次出现错误。等了几秒钟后,我成功运行了它,之后再也没有遇到这个问题,但是能够解释一下这个问题会很好。

操作系统是Ubuntu 9.04,文件系统为ext3。


请参阅SF:http://serverfault.com/questions/21561/bad-interpreter-text-file-busy - Ether
6个回答

27

我猜你遇到了这个问题

如果你尝试执行一个Perl脚本(或任何其他类型的脚本)时,它正在写入时,Linux内核将生成一个“bad interpreter: Text file busy”错误。

你没有说明磁盘密集型进程在做什么。有没有可能其中一个进程已经以读+写方式打开了该脚本(即使实际上并没有写入任何内容)?


3
也许那个“磁盘密集型进程”并没有直接影响你的脚本,但它占用了足够多的磁盘资源,导致你在写出脚本的时候陷入停顿,使其保持开启状态几秒钟之久。 - hobbs
1
这可能意味着脚本正在被编写,或者解释器本身正在被编写 -- 无论哪种情况,都会发生相同的错误。 - Charles Duffy
有点奇怪,这不被视为内核错误。 - tchrist
@tchrist,是因为奇怪的错误信息,还是因为它不允许你在脚本被编写时运行它? - cjm
1
谢谢。我的同事之前也遇到了相同的问题。结果发现他用于将脚本上传到服务器的图形化FTP客户端仍然占用着文件。一旦我关闭了FTP连接,我就能够运行这些脚本了。 - Tulains Córdova
显示剩余5条评论

7
这是因为脚本文件仍在被写入,可能是由于未终止的恶意进程正在访问它。
解决方案:检查哪个进程仍在访问该文件,并终止它。
例如:
# /root/wordpress_plugin_updater/updater.pl --wp-path=/var/www/virtual/joel.co.in/drjoel.in/htdocs
-bash: /root/wordpress_plugin_updater/updater.pl: /root/perl/bin/perl: bad interpreter: Text file busy

在脚本名称上运行 lsof(打开文件列表命令):

# lsof | grep updater.pl
sftp-serv 4416            root    3r      REG            144,103    11043   33046751 /root/wordpress_plugin_updater/updater.pl

通过进程ID杀死进程:

kill -9 4416

现在尝试再次运行脚本。现在它可以工作了。
# /root/wordpress_plugin_updater/updater.pl --wp-path=/www/htdocs
Wordpress Plugin Updater script v3.0.1.0.
Processing 24 plugins from

3

如果脚本在Windows或任何其他具有不同“本机”行尾的操作系统中进行编辑,那么问题可能只是在第一行末尾“隐藏”的CR (^M)。 Vi可以设置隐藏这个非本地行尾。在我的情况下,我只需在VI中重新输入有问题的第一行,错误就消失了。


这对我有用,我试图使用“DOS”EOL,但我正在使用Ubuntu,而Ubuntu使用UNIX EOL。 - Bryan Contreras

2
如果您正在使用GNU Parallel并出现此错误,则可能是因为您正在从相同的位置流式传输文件,同时又将文件写出到该位置...

这就是在我的情况下发生的事情。 - Sagar

2

这通常与perl解释器(/usr/bin/perl)无法访问有关。实际上,当一个shell脚本正在运行或awk或其他在脚本顶部的#!行中时,它就会发生。

原因可能有很多...权限、锁定文件、文件系统离线等等。

显然,这取决于问题发生时您运行它时正在发生什么。但我希望答案是你要找的。


1
“text file busy”这个错误信息有特定的含义,不会由你提到的任何问题引起。 - user149341
1
@duskwuff,能否详细说明一下?你能与我们分享你的智慧吗?(顺便说一句,我的研究结果正是我所分享的内容)。 - Rap
2
@duskwuff,这个答案所描述的具体含义确切无误。您可以自行尝试打开/usr/bin/perl以进行附加操作,然后运行Perl脚本。是的,“文本文件”有些误导人,但是这个错误已经标准化了数十年。 - Charles Duffy

0

我也遇到过这个问题,通过grep查看文件的使用情况没有起作用。结果发现我只需要重新启动droplet,然后脚本就可以正常工作。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接