Python смонтирован зависает с устаревшим монтированием. Предложения?

Сегодня я столкнулся с проблемой, когда монтирование устарело, и это привело к тому, что все мое приложение Python зависло на неопределенный срок.

Случилось так, что монтирование устарело, а затем я позвонил os.path.exists(path) по этому пути. Звонок зависает на неопределенное время.

Мне действительно нужно предотвратить это. Моя единственная идея состоит в том, чтобы поместить вызов os.path.exists в фоновый поток и резко убить поток (очевидно, что это не предпочтительно), если он все еще жив после тайм-аута в несколько секунд. В идеале я бы избежал этого, сделав вызов, чтобы сначала проверить, не устарело ли монтирование.

Любые идеи? К вашему сведению, все вызовы, пытающиеся получить доступ к этому пути, зависают, включая os.path.ismount(path). Хотя это редкое событие, я не могу допустить, чтобы вся моя система зависала на пользователях :/.


person user1777820    schedule 03.05.2013    source источник
comment
Я видел такое поведение с некоторыми пользовательскими файловыми системами (предохранители и т. д.). Это больше похоже на проблему реализации файловой системы, которая перестает давать ответы, когда ядро ​​спрашивает. Я бы переименовал вопрос как Linux, Kernel (если применимо).   -  person Armin Rigo    schedule 04.05.2013
comment
Это в Ubuntu монтирует удаленный диск CentOS (я полагаю, nfs). Никаких странных файловых систем. В настоящее время мы пробуем вариант мягкого монтирования nfs, но еще не сталкивались с устареванием монтирования для тестирования.   -  person user1777820    schedule 07.05.2013


Ответы (2)


Вы можете использовать модуль подпроцесса python и команду «тайм-аут» оболочки для обнаружения монтирования зависания:

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.
person myheartsgoon    schedule 01.08.2017

Аналогичен ответу myheartsgoon, но безопаснее и проще.

try:
    subprocess.check_call(["timeout", "4", "ls", "/mnt/your_nas"])
except subprocess.CalledProcessError:
    # is hanging
person Magnus    schedule 04.09.2020