我有一个类似的问题检查python脚本中是否挂载了NFS共享 https://stackoverflow.com/questions/2889490/check-if-nfs-share-is-mounted-in-python-script,但是在我的例子中,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,这是一个设计选择。下面还提供了一些示例调用。
code
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')
调用示例
这应该没有错误地返回:
call_timeout(["sleep", "1"], 0.5)
这将引发 OSError 错误:
call_timeout(["sleep", "1"], 1.5)
你想要这样的东西:
call_timeout(["ls", "/path/to/mountpoint"], 5.0)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)