“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
也许现在这个问题已经完全回答了:)。