如何使用stat的读取超时?

时间:2013-07-19 16:56:08

标签: bash nfs stat subshell process-substitution

我有以下代码:

#!/bin/bash

read -t1 < <(stat -t "/my/mountpoint")
if [ $? -eq 1 ]; then
  echo NFS mount stale. Removing... 
  umount -f -l /my/mountpoint
fi

如何在同时仍然能够在后续测试中检测到其错误级别时静音stat的输出?

在子shell中或在读取行的末尾添加>/dev/null 2>&1不起作用。但必须有办法......

感谢您对此有任何见解!

2 个答案:

答案 0 :(得分:3)

使用命令 - 子代理,而不是处理替换

不要从进程替换中读入,而是考虑使用命令替换。例如:

mountpoint=$(stat -t "/my/mountpoint" 2>&1)

这会通过将标准输出存储在变量中来使输出静音,但可以通过解除引用 $ mountpoint 来检索结果。此方法还可以通过 $?来访问退出状态。

更清晰的替代方案

或者,您可以更简单地将其重写为:

mountpoint="/my/mountpoint"
if stat -t "$mountpoint" 2>&-
then
    echo "NFS mount stale. Removing..."
    umount -f -l "$mountpoint"
fi

对我来说,这似乎更有意思,更不容易出错,但你的里程肯定会有所不同。

(Ab)使用Read Timeouts

在评论中,OP询问是否可以滥用读取超时来处理来自 stat 的挂起输入。答案是肯定的,如果您关闭标准错误并检查空 $ REPLY 字符串。例如:

mountpoint="/my/mountpoint"
read -t1 < <(stat -t "$mountpoint" 2>&-)
if [[ -n "$REPLY" ]]; then
    echo "NFS mount stale. Removing..."
    umount -f -l "$mountpoint"
fi

这有几个原因:

  1. 在Bash中使用 read 内置时:

      

    如果没有提供NAME,读取的行将存储在REPLY变量中。

  2.   
  3. 关闭标准错误后, $ REPLY 将为空,除非 stat 在标准输出上返回某些内容,如果遇到错误则不会。换句话说,您正在检查 $ REPLY 字符串的内容,而不是 read 的退出状态。
  4.   

答案 1 :(得分:0)

我想我明白了!您的响应中提到的重定向似乎在子shell中工作,而不会像2&gt;&amp; 1那样消除返回代码。所以这可以按预期工作:

read -t1 < <(rpcinfo -t 10.0.128.1 nfs 2>&-)
if [ $? -eq 0 ]; then
  echo "NFS server/service available!"
else
  echo "NFS server/service unavailable!"
fi

其中10.0.128.1是“坏”IP(没有服务器/服务响应)。该脚本在一秒内超时并产生“NFS服务器/服务不可用!”响应,但没有来自rpcinfo的输出。同样,当IP良好时,输出所需的响应。

我赞成你的回复!