8

通常在 NFS 客户端上,如何使用 Bash Shell 脚本从 Server-end 检测 Mounted-Point is no more available 或 DEAD ?

通常我会:

if ls '/var/data' 2>&1 | grep 'Stale file handle';
then
   echo "failing";
else
   echo "ok";
fi

但问题是,特别是当 NFS 服务器完全死机或停止时,即使是ls在客户端进入该目录的命令也会被挂起或死机。意味着,上面的脚本不再可用。

请问有什么方法可以再次检测到这个吗?

4

3 回答 3

10

“stat”命令是一种更简洁的方式:

statresult=`stat /my/mountpoint 2>&1 | grep -i "stale"`
if [ "${statresult}" != "" ]; then
  #result not empty: mountpoint is stale; remove it
  umount -f /my/mountpoint
fi

此外,您可以使用 rpcinfo 来检测远程 nfs 共享是否可用:

rpcinfo -t remote.system.net nfs > /dev/null 2>&1
if [ $? -eq 0 ]; then
  echo Remote NFS share available.
fi

添加 2013-07-15T14:31:18-05:00:

我进一步研究了这一点,因为我还在处理需要识别陈旧挂载点的脚本。受到对“是否有一种检测陈旧 NFS 挂载的好方法”的回复的启发,我认为以下可能是检查 bash 中特定挂载点是否陈旧的最可靠方法:

read -t1 < <(stat -t "/my/mountpoint")
if [ $? -eq 1 ]; then
   echo NFS mount stale. Removing... 
   umount -f -l /my/mountpoint
fi

如果 stat 命令由于某种原因挂起,“read -t1”构造可靠地超时子shell。

添加 2013-07-17T12:03:23-05:00:

虽然read -t1 < <(stat -t "/my/mountpoint")有效,但似乎没有办法在挂载点过时时静音其错误输出。在子外壳中添加> /dev/null 2>&1,或者在命令行末尾添加会破坏它。使用简单的测试:if [ -d /path/to/mountpoint ] ; then ... fi也可以,并且在脚本中可能更可取。经过多次测试,这是我最终使用的。

添加 2013-07-19T13:51:27-05:00:

对我的问题“我如何将读取超时与 stat 一起使用? ”的回复提供了有关在目标不可用且命令挂起几分钟后在其超时之前静音 stat(或 rpcinfo)的输出的更多详细信息自己的。虽然[ -d /some/mountpoint ]可用于检测陈旧的挂载点,但 rpcinfo 没有类似的替代方法,因此使用read -t1重定向是最佳选择。子shell的输出可以用2>&-静音。这是CodeMonkey 响应的示例:

mountpoint="/my/mountpoint"
read -t1 < <(stat -t "$mountpoint" 2>&-)
if [[ -n "$REPLY" ]]; then
  echo "NFS mount stale. Removing..."
  umount -f -l "$mountpoint"
fi

也许现在这个问题已经完全回答了:)。

于 2013-07-14T22:43:37.857 回答
2

Ville 和 CodeMonkey 给出的最终答案几乎是正确的。我不确定没有人注意到这一点,但是具有内容的 $REPLY 字符串是成功的,而不是失败的。因此,的$REPLY 字符串意味着挂载已过时。因此,条件应该使用 -z,而不是 -n:

mountpoint="/my/mountpoint"
read -t1 < <(stat -t "$mountpoint" 2>&-)
if [ -z "$REPLY" ] ; then
  echo "NFS mount stale. Removing..."
  umount -f -l "$mountpoint"
fi

我已经使用有效和无效的挂载点多次运行它并且它可以工作。-n 检查给了我相反的结果,当它绝对有效时,回显安装是陈旧的。

此外,简单的字符串检查不需要双括号。

于 2016-05-17T13:12:06.047 回答
0

使用“-z”我得到一个 NFS 陈旧但它完全错误,我可以访问它并读取和写入文件

于 2019-05-14T07:03:08.850 回答