ls NFS服务器重启后挂起

我有服务器A和服务器B. B充当一个nfs服务器,A从B安装。

两者都在EC2上运行。

有时我必须closuresB并启动一个新的实例(相同的实例)。 在B被备份后,试图在A上挂载的目录(例如ls)执行任何操作。

我试图build立一个检查挂载状态的cron,如果有任何错误,则重新挂载。

有没有办法检查一个mount的状态?

您可以分叉,让孩子进入目录,然后退出孩子。 让父母用超时监视subprocess的存在。 如果你有一个陈旧的挂载,孩子将无法退出,并会坚持很长一段时间,所以超时将发生在父母。 让父母杀死孩子并尝试卸载。

但是,您可能会遇到的问题是,如果其他进程正在使用位于损坏的安装目录上的文件,则无需先删除这些进程即可卸载该文件。 您可以(经常)发现是否有任何进程正在使用lsof或fuser在陈旧的安装上使用不可用的资源。

我会避免自动魔法杀死任意过程, 发送一个通知手动进一步调查。

为了减less发生这种情况的可能性,您可能需要查看自动挂载程序,该挂载程序在需要/请求服务器上的资源之前将不会挂载该卷,并在不再需要时自动将其卸载。

– 顺便说一句,为了使这个更可search,你可能想用stale,stuck,nfs和mount这个词来标记它。 这种现象并不特定于您使用ec2。

我意识到,当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