![如何使 Linux 内核执行打开以进行写入的文件,或修复“文本文件忙”错误](https://linux22.com/image/179324/%E5%A6%82%E4%BD%95%E4%BD%BF%20Linux%20%E5%86%85%E6%A0%B8%E6%89%A7%E8%A1%8C%E6%89%93%E5%BC%80%E4%BB%A5%E8%BF%9B%E8%A1%8C%E5%86%99%E5%85%A5%E7%9A%84%E6%96%87%E4%BB%B6%EF%BC%8C%E6%88%96%E4%BF%AE%E5%A4%8D%E2%80%9C%E6%96%87%E6%9C%AC%E6%96%87%E4%BB%B6%E5%BF%99%E2%80%9D%E9%94%99%E8%AF%AF.png)
我使用 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挂载点“ 展示?