如果NFS服务器已挂载并联机,请检入python脚本

时间:2012-12-03 14:24:43

标签: python linux nfs

我有类似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命令显示本地目录的内容而不是停止终端。

1 个答案:

答案 0 :(得分:8)

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')

示例调用

这应该返回没有错误:

call_timeout(["sleep", "1"], 0.5)

这会引发OSError错误:

call_timeout(["sleep", "1"], 1.5)

你想要这些内容:

call_timeout(["ls", "/path/to/mountpoint"], 5.0)