繁体   English   中英

Linux Shell 脚本:如何检测 NFS 挂载点(或服务器)已死?

[英]Linux Shell Script: How to detect NFS Mount-point (or the Server) is dead?

通常在 NFS 客户端上,如何使用 Bash Shell 脚本从服务器端检测 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命令,在客户端也会被挂起或死机。 意味着,上面的脚本不再可用。

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

“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")有效,但是当挂载点过时时,似乎没有办法将其错误输出静音。 在子shell中或在命令行的末尾添加> /dev/null 2>&1会破坏它。 使用简单的测试: if [ -d /path/to/mountpoint ] ; then ... fi 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

也许现在这个问题得到了充分的回答:)。

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检查给了我相反的结果,当它完全有效时回显挂载是陈旧的。

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

使用“-z”我得到一个NFS陈旧但它完全错了,我可以接受它并读写文件

根据此处的答案,我在测试中发现了一些问题,这些问题将 output 由于 $REPLY var 将如何更新(或不更新,如果结果为空)以及答案中提供的 stat 命令不一致.

这使用 stat 命令检查快速或即时响应更改的 FS 类型,并检查 $REPLY 的内容以确保 fs 是 NFS [ ref: https://unix.stackexchange.com/questions/20523/如何确定存在什么文件系统目录存在]

read -t1 < <(timeout 1 stat -f -c %T "/mnt/nfsshare/");if [[ ! "${REPLY}" =~ "nfs" ]];then echo "NFS mount NOT WORKING...";fi

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM