1

我今天遇到了一个问题,挂载过时,这导致我的整个 python 应用程序无限期挂起。

发生的事情是坐骑变得陈旧,然后我os.path.exists(path)就在那条路上打电话。通话无限期挂起。

我真的真的需要防止这种情况发生。我唯一的想法是将os.path.exists调用放在后台线程上,如果在超时几秒后它仍然存在,则突然终止线程(显然不是首选)。理想情况下,我会先打电话检查挂载是否过时来避免这种情况。

有任何想法吗?仅供参考,所有尝试访问此路径的调用都挂起,包括os.path.ismount(path). 虽然这是一个罕见的事件,但我不能让我的整个系统冻结用户:/。

4

2 回答 2

1

您可以使用 python 子进程模块和 shell“超时”命令来检测挂载:

call = subprocess.Popen(["timeout 10 ls /your_mount_dir/ &> /dev/null; echo $?"], stdout=subprocess.PIPE, shell=True)
output = call.communicate()
result = output[0].strip()
if result != '0':
   # Mount is hung.
于 2017-08-01T03:15:11.017 回答
0

类似于myheartsgoon的答案,但更安全、更简单。

try:
    subprocess.check_call(["timeout", "4", "ls", "/mnt/your_nas"])
except subprocess.CalledProcessError:
    # is hanging
于 2020-09-04T11:25:00.733 回答