![ls зависает после перезагрузки сервера NFS](https://rvso.com/image/515017/ls%20%D0%B7%D0%B0%D0%B2%D0%B8%D1%81%D0%B0%D0%B5%D1%82%20%D0%BF%D0%BE%D1%81%D0%BB%D0%B5%20%D0%BF%D0%B5%D1%80%D0%B5%D0%B7%D0%B0%D0%B3%D1%80%D1%83%D0%B7%D0%BA%D0%B8%20%D1%81%D0%B5%D1%80%D0%B2%D0%B5%D1%80%D0%B0%20NFS.png)
У меня есть сервер A и сервер B. B действует как сервер NFS, A монтируется с B.
Оба работают на EC2.
Иногда мне приходится выключать B и запускать новый экземпляр (идентичный экземпляр). После того, как B снова запускается, попытка сделать что-либо внутри смонтированного каталога на A (например, ls) просто зависает.
Я пытаюсь настроить cron, который проверяет состояние монтирования и перемонтирует его, если что-то не так.
Есть ли способ проверить статус ездового животного?
решение1
Вы можете разветвиться, заставить дочерний процесс войти в каталог, а затем выйти из дочернего процесса. Пусть родительский процесс отслеживает существование дочернего процесса с помощью тайм-аута. Если у вас есть устаревшее монтирование, дочерний процесс не сможет выйти и будет висеть в течение длительного времени, поэтому тайм-аут произойдет в родителе. Пусть родительский процесс убьет -9 дочерний процесс и попробует размонтировать.
Проблема, с которой вы можете столкнуться, заключается в том, что если какой-либо другой процесс использует файл, который находится на сломанном монтировании, то вы не сможете размонтировать его, не убив сначала эти процессы. Вы можете (часто) обнаружить, используют ли какие-либо процессы недоступные ресурсы на устаревшем монтировании с помощью lsof или fuser.
Однако я бы не советовал автоматически завершать произвольные процессы; отправьте себе уведомление, чтобы продолжить расследование вручную.
Чтобы снизить вероятность возникновения этой проблемы, вы можете рассмотреть функцию автоматического монтирования, которая не будет монтировать том до тех пор, пока он не понадобится или не будет запрошен ресурс на сервере, и автоматически отмонтирует его, когда он больше не нужен.
-- кстати, чтобы сделать это более доступным для поиска, вы можете пометить это словами stale, stuck, nfs и mount. Это явление не является специфическим для вашего использования ec2.
решение2
Я понял, что когда сервер NFS перезагружается, он меняет свой IP-адрес, поэтому монтирование не работает.
Написал этот скрипт, который проверяет, является ли IP хоста NFS IP, который в данный момент используется в монтировании, если нет, он размонтируется и перемонтируется. Может помочь кому-то в будущем.
#!/bin/bash
NFS_HOST=$(mount | grep nfs | awk '{ print $1 }' | cut -d ":" -f 1)
NFS_HOST_PATH=$(mount | grep nfs | awk '{ print $1 }' | cut -d ":" -f 2)
host $NFS_HOST
if [[ $? -ne 0 ]]; then
echo "NFS host $NFS_HOST doesn't exist!"
exit 2
fi
MOUNT_POINT=$(mount | grep $NFS_HOST | awk '{ print $3 }')
NFS_IP=$(host $NFS_HOST | awk '{ print $4 }')
mount | grep "$NFS_IP"
if [[ $? -ne 0 ]]; then
umount -fl $MOUNT_POINT
mount "$NFS_HOST:$NFS_HOST_PATH" $MOUNT_POINT
fi