检查 NFS 目录是不是在失败时挂载而没有大挂起

Posted

技术标签:

【中文标题】检查 NFS 目录是不是在失败时挂载而没有大挂起【英文标题】:Check if NFS Directory Mounted without Large Hangs on Failure检查 NFS 目录是否在失败时挂载而没有大挂起 【发布时间】:2014-01-14 11:48:01 【问题描述】:

我正在编写一个 shell 脚本来检查集群中的节点是否可以看到某些 nfs 挂载。

脚本通过执行 ls /nfs/"machine" |wc -l 来工作,如果它大于 0,它将通过测试。我对这个解决方案的主要关注是如果没有安装磁盘,ls 会挂起多长时间。

我尝试了这个问题“bash checking directory existence hanging when NFS mount goes down”的解决方案,但结果与实际安装的不符。

我也尝试过执行 df -h /nfs/"machine",但如果未安装磁盘,则会出现很大的挂起。

基本上,有没有其他方法可以让我知道磁盘是否已安装而不会出现大挂起?

或者,有没有办法限制命令可以执行的时间?

提前致谢!

【问题讨论】:

【参考方案1】:

好的,我设法使用 timeout 命令解决了这个问题,我在这里查看了 BroSlow 用非常相似的解决方案更新了他的答案。感谢 BroSlow 的帮助。

为了解决问题,我使用的代码是:

if [[ `timeout 5s ls /nfs/machine |wc -l` -gt 0 ]] ; then
      echo "can see machine"
else
      echo "cannot see machine"
fi

然后我将其简化为单行命令,以便它可以通过 ssh 运行并放入循环中(循环通过主机并执行此命令)。

【讨论】:

【参考方案2】:

几种可能性:

1)

find /nfs/machine -maxdepth 0 -empty 应该比ls /nfs/machine 快很多,虽然我不确定这是否是这种情况下的问题(也不确定是否需要sleep,但可能会有一些偏移。

if [[ $(find /nfs/machine -maxdepth 0 -empty 2> /dev/null) == "" ]]; then
  sleep 1 && [[ $(mount) == *"/nfs/machine"* ]] && echo "mounted" || echo "not mounted"
else
  echo "mounted"
fi

2)

timeout 10 ls -A /nfs/machine | wc -l
if [[ $? > 0 ]]; then
  echo "mounted"
else
  echo "not mounted"
fi

【讨论】:

我明白了,我尝试了您的解决方案,但遇到的主要问题是如果集群尚未访问该磁盘,您的命令将失败,但在 ls /nfs/ 之后机器你的命令是成功的。因此,即使集群节点可以访问 /nfs/machine,这也有可能失败。我的测试是看磁盘是否可以挂载,而不是当前是否挂载。 @stuts 编辑了其他几种可能性,为您完成其中任何一种工作(在几秒钟内将timeout 更改为合理的值或附加m 等...几分钟)

以上是关于检查 NFS 目录是不是在失败时挂载而没有大挂起的主要内容,如果未能解决你的问题,请参考以下文章

nfs问题导致df挂起

检查 NFS 共享是不是安装在 python 脚本中

linux挂载aixnfs没有写权限

如何修复 kubernetes nfs 挂载错误没有这样的文件或目录

如何判断(在 sh 中)一个目录是不是挂载在 NFS 上

nfs-utils bug导致nfs挂载失败