检查 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 目录是不是在失败时挂载而没有大挂起的主要内容,如果未能解决你的问题,请参考以下文章