【问题标题】: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",但如果未安装磁盘,则会出现很大的挂起。

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

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

提前致谢!

【问题讨论】:

    标签: linux bash shell mount nfs


    【解决方案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 等...几分钟)
      猜你喜欢
      • 1970-01-01
      • 2012-03-14
      • 2010-10-02
      • 2014-02-13
      • 1970-01-01
      • 2010-12-11
      • 2020-02-19
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多