我有一个类似于检查NFS共享是否挂载在python脚本中的问题,但在我的情况下,NFS服务器已挂载,但服务器崩溃并脱机.我试图通过使用考虑到这一点,os.dir.ismount('/path/to/mountpoint/)
但我的问题是这个命令需要永远完成.
当我试图做一个简单的ls /path/to/mountpoint
命令时,这个命令也没有完成.有什么根本错误的吗?我的设置是一个Linux NFSv3服务器和一个Linux NFS客户端.
我通常希望如果NFS服务器不可安装或不再可访问,则该ls
命令显示本地目录的内容而不是暂停终端.
这种情况发生在NFS上,如果您已经挂载了NFS共享并且服务器不再经常可以通过网络访问,那么对挂载的任何IO访问都会被卡住.如果你尝试在终端中运行ls,你会发现它只是卡住,不会失败只是无休止地等待它永远不会得到的响应.所以我建议你做的是在python代码中运行ls然后设置超时.达到此超时后,您可以让它引发异常.以下是我测试过的实现.call_timeout是一个函数,它为您提供要执行的命令和超时时间(以秒为单位).如果命令在超时之前完成,它会立即返回,否则它会终止它产生的进程,并引发一个可以捕获的OSError.你可以选择返回True或False,这是一个设计选择.下面还提供了一些示例调用.
码
from subprocess import Popen, check_output
import time
def call_timeout(cmd, timeout):
start = time.time()
p = Popen(cmd)
while time.time() - start < timeout:
if p.poll() is not None:
return
time.sleep(0.1)
p.kill()
raise OSError('command timed out')
Run Code Online (Sandbox Code Playgroud)
示例调用
这应该返回没有错误:
call_timeout(["sleep", "1"], 0.5)
Run Code Online (Sandbox Code Playgroud)
这会引发OSError错误:
call_timeout(["sleep", "1"], 1.5)
Run Code Online (Sandbox Code Playgroud)
你想要这些方面的东西:
call_timeout(["ls", "/path/to/mountpoint"], 5.0)
Run Code Online (Sandbox Code Playgroud)