9

当我尝试执行 perl 文件而该文件当前正被另一个进程使用时,我收到此消息 - “文本文件忙”。

根据这个/usr/bin/perl: bad interpreter: Text file busy,当我尝试执行 perl 文件打开以进行写入时,会发生此问题。

但是文件的权限是-r-xr-xr-x。它不提供写入权限。

当两个进程试图同时执行一个 perl 文件时,会发生“文本文件忙”吗?

4

2 回答 2

11

不,这不会仅仅因为两个 Perl 脚本同时执行而发生。

更可能的解释是,当操作系统试图读取它的 shebang 行以确定要使用的解释器时,脚本本身是可写的。

如果外部进程试图升级或修改 Perl 解释器本身,或者它所依赖的共享库之一,也会发生这种情况。请注意,文件权限通常不适用于超级用户帐户,例如 root,因此任何以超级用户身份运行的进程仍然可以尝试修改 Perl 解释器,尽管没有+w设置任何位。

(也就是说,在 POSIX 风格的操作系统上,大多数表现良好的操作系统升级工具会将升级版本的二进制文件写入同一文件系统上的新文件,完成后关闭该文件,并将其重命名为原始文件(原子操作)——这样附加的 inode/usr/bin/perl本身就永远不会打开以供写入。因此,在表现良好的系统上,您看到的错误在实践中不应该出现)。

您可以使用该fuser命令查看谁为您的脚本或其解释器打开了文件:

$ sudo fuser /usr/bin/perl -uv
                     USER        PID ACCESS COMMAND
/usr/bin/perl:       root      16579 f.... (root)python
于 2012-05-17T15:11:26.847 回答
2

但是文件的权限是-r-xr-xr-x。它不提供写入权限。

权限可以在打开脚本写入后,脚本运行前设置。

下面的代码示例your-script在当前目录中编写一个新的 perl 脚本,使其可执行,同时删除写权限,并尝试运行 perl 脚本。最终权限是,-r-xr-xr-x但文件仍然打开以进行写入,这就是脚本生成“文本文件忙”错误的原因:

#!/usr/bin/env python3
import os
import stat
import subprocess

file = open('./your-script', 'w') # specify full path
try:
    file.write("#!/usr/bin/perl\nprint 'unreachable';") 
    file.flush() # make sure the content is sent to OS
    os.chmod(file.name, 0o555) # make executable
    print(stat.filemode(os.stat(file.name).st_mode)) # -r-xr-xr-x
    subprocess.call(file.name) # run it
except Exception as e:
    print(e)
finally:
    os.remove(file.name)
于 2014-03-15T06:14:58.843 回答