我在 Linux 上有一个脚本,我在 Windows 下(通过 Samba)编辑该脚本,该脚本以 shebang 行开头#!/bin/bash
。即使:
- 我完成编辑,保存并关闭编辑器中的文件
- 确保文件未在其他地方打开
- 确保文件以 Unix 行结尾保存
cat
在 Linux 下检查文件并确保编辑存在stat
Linux 下的文件,并确保编辑后有时间戳
/bin/bash: bad interpreter: Text file busy
当我尝试执行它时,一段时间后(大约一两分钟)仍然会出现错误。为什么?
注意:该文件是不是缓存在客户端上。该文件在服务器上可见cat
。也可以/bin/bash
在其上运行。它是仅有的当使用 shebang 行时,即当文件本身执行时,就会发生上述错误。
答案1
Samba 支持所谓的机会锁。
当客户端想要读取文件而没有人写入文件时,Samba 将为该客户端提供读取机会锁。这样,客户端就可以缓存数据,而不必从服务器反复读取数据。如果另一个客户端想要写入文件,Samba 将向拥有机会锁的客户端发出“中断机会锁”请求,这样它就知道不能再缓存了。
类似地,当客户端想要写入文件而没有其他人访问该文件时,Samba 将为该客户端提供写入机会锁。这允许它缓冲写入、缓存读取并假定它可以读取自己的写入而无需打扰服务器。如果另一个客户端想要读取或写入文件,Samba 将向具有机会锁的客户端发出“中断机会锁”请求,强制它刷新所有缓冲的写入并停止缓冲和缓存。
发生的情况是 Windows 计算机持有写入机会锁。由于您是从主机访问文件(而不是通过 Samba),因此 Samba 没有机会要求客户端打破机会锁。因此,服务器无法知道文件的内容是否可用,或者实际内容是否仍然只有客户端知道。在打破写入机会锁之前,无法执行该文件。
如果愿意,您可以配置 Samba 不对该共享、文件、扩展或任何有意义的内容使用 oplock。由于缓存和缓冲减少,因此性能会有所损失。