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)