【问题标题】:Can "Text file busy" happen when two processes trying to execute a perl file in the same time?当两个进程试图同时执行一个 perl 文件时,会发生“文本文件忙”吗?
【发布时间】:2012-05-25 04:20:51
【问题描述】:

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

根据/usr/bin/perl: bad interpreter: Text file busy,当我尝试执行 perl 文件时,会出现此问题。

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

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

【问题讨论】:

  • (这可能更像是一个系统管理问题——它取决于特定于操作系统的语义,并且与 Perl 甚至解释语言无关——所以在未来,服务器故障可能是更合适的场所)

标签: linux


【解决方案1】:

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

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

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

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

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

$ sudo fuser /usr/bin/perl -uv
                     USER        PID ACCESS COMMAND
/usr/bin/perl:       root      16579 f.... (root)python

【讨论】:

  • 感谢您的扩展,Charles。这个 perl 文件由 root 在 clearcase 视图下执行。看了你的帖子,我猜是 clearcase 视图导致了这个问题,实际的 perl 文件不提供写权限,但 clearcase 视图中的文件可能提供。
【解决方案2】:

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

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

这里的代码示例在当前目录中编写了一个新的 perl 脚本your-script,在删除写权限的同时使其可执行,并尝试运行 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)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2022-01-06
    • 1970-01-01
    • 1970-01-01
    • 2014-10-18
    • 1970-01-01
    • 1970-01-01
    • 2021-06-23
    • 1970-01-01
    相关资源
    最近更新 更多