NFS 服务器重启后 ls 挂起

NFS 服务器重启后 ls 挂起

我有服务器 A 和服务器 B。B 充当 nfs 服务器,A 从 B 挂载。

两者都在 EC2 上运行。

有时我必须关闭 B 并启动一个新实例(相同实例)。B 恢复后,尝试在 A 上安装的目录中执行任何操作(例如 ls)都会挂起。

我正在尝试设置一个 cron 来检查挂载的状态,如果有任何问题则重新挂载。

有没有什么办法可以检查挂载的状态?

答案1

您可以 fork,让子进程进入目录,然后退出子进程。让父进程使用超时来监视子进程的存在。如果您有一个过时的挂载,子进程将无法退出,并且会停留很长时间,因此父进程中会发生超时。让父进程 kill -9 子进程并尝试卸载。

但是,您可能会遇到的问题是,如果任何其他进程正在使用损坏的挂载上的文件,则您必须先终止这些进程才能卸载它。您(通常)可以使用 lsof 或 fuser 发现是否有任何进程正在使用陈旧挂载上的不可用资源。

不过,我会避免自动终止任意进程;向自己发送通知以手动进行进一步调查。

为了减少这种情况发生的可能性,您可能需要研究自动挂载程序,它在需要时/请求服务器上的资源时才会挂载该卷,并在不再需要时自动卸载它。

-- 顺便说一句,为了使此内容更易于搜索,您可能需要使用 stale、stuck、nfs 和 mount 等字词来标记此内容。此现象并非特定于您对 ec2 的使用。

答案2

我意识到当 NFS 服务器重新启动时,它会改变其 IP,因此挂载将无法工作。

编写了这个脚本,检查 NFS 主机的 IP 是否是当前挂载时使用的 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

相关内容