如何使 Linux 内核执行打开以进行写入的文件,或修复“文本文件忙”错误

如何使 Linux 内核执行打开以进行写入的文件,或修复“文本文件忙”错误

我使用 NFS 来编辑服务器上的文件。当这些文件是带有 shebang 行的脚本时,我执行它们时,每次保存后都会收到“文本文件忙”错误大约 5 秒。

如果在 vi(4.19 内核)中打开文件,则可以重现相同的问题,如下所示:

:>test.sh
chmod +x test.sh
vi test.sh
# Ctrl-Z to suspend vi
./test.sh
# text file busy: ./test.sh

在 5.7 内核上,上述 vi 示例不会产生错误,但从 5.7 到 5.7 系统的 NFS 写入在每次保存后仍会产生“文本文件忙”错误 5 秒。

https://stackoverflow.com/questions/16764946/what-generates-the-text-file-busy-message-in-unix可以通过显式调用运行脚本的二进制文件来解决该错误:

bash test.sh

我相信我可以编写一个脚本,调用它e,它将打开参数给定的路径,查看文件是否以 shebang 开头,如果是,则解析 shebang 行并手动调用 shebang 中的二进制文件:

e ./test.sh

但是,这就引出了一个问题:我为操作系统付费是为了什么?

如何配置 Linux 来执行打开以进行写入的文件?

我 grep 了 5.7 内核源代码ETXTBUSY,但没有产生任何结果。

或者,作为一种不太通用的解决方法,我怎样才能使 NFS 上的写入立即关闭正在写入的文件,而不是保持打开状态大约 5 秒?

编辑:

根据评论,vi(更准确地说,nvi)的问题是这个在 Debian 上的 1.81.6-16 中已修复(我的 4.19 系统有 1.81.6-15,5.7 系统有 1.81.6-16)。我仍然想弄清楚如何使 NFS 保存不会产生文本文件繁忙错误。

第二次编辑:

/etc/exports在服务器上:

/home/w 10.0.9.0/24(rw,insecure)

安装有-o soft,intr

serene:/home/w on /mnt/speed type nfs4 (rw,relatime,vers=4.2,rsize=1048576,wsize=1048576,namlen=255,soft,proto=tcp,timeo=600,retrans=2,sec=sys,clientaddr=10.0.9.153,local_lock=none,addr=10.0.2.2)

服务器包(Devuan 测试):

serene% dpkg -l|grep nfs
ii  libnfsidmap2:amd64                   0.25-5.1                            amd64        NFS idmapping library
ii  nfs-common                           1:1.3.4-4                           amd64        NFS support files common to client and server
ii  nfs-kernel-server                    1:1.3.4-4                           amd64        support for NFS kernel server

我当前无法重现问题的工作客户端上的客户端包(Devuan 测试):

averagest% dpkg -l|grep nfs
ii  libnfsidmap2:amd64                   0.25-5.1                           amd64        NFS idmapping library
ii  nfs-common                           1:1.3.4-4                          amd64        NFS support files common to client and server

答案1

我还不能发表评论,但是您能给我们提供有关您的环境的更多具体信息吗?

我无法重现您所看到的行为。例如,我在 /test 上安装了一个 NFS 文件系统。如果我运行以下命令,它会立即返回,根本没有 5 秒延迟:

$ cd /test
$ vi xx; chmod 755 xx; ./xx
Tue Sep  8 17:45:17 EDT 2020

我放入xx的内容是:

#!/bin/sh
date

另外,如果我“vi xx”和CTRL-Z暂停,没有延迟,也没有任何错误:

$ vi xx
(CTRL-Z)
[1] + Stopped                  vi xx
$ ./xx
Tue Sep  8 17:51:01 EDT 2020

我正在测试:CentOS Linux 版本 7.7.1908。我不希望 NFS 在 Linux 之间表现不同,但你永远不能确定。

如果您使用 vim 而不是 nvi,行为会改变吗?

“mount | grep”是什么意思nfs挂载点“ 展示?

相关内容