【问题标题】:How can I use read timeouts with stat?如何使用 stat 读取超时?
【发布时间】:2013-07-19 01:29:03
【问题描述】:

我有以下代码:

#!/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 内或在读取行的末尾添加&gt;/dev/null 2&gt;&amp;1 不起作用。但一定有办法……

感谢您对此的任何见解!

【问题讨论】:

    标签: bash nfs stat subshell process-substitution


    【解决方案1】:

    使用命令替换,而不是进程替换

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

    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)使用读取超时

    在 cmets 中,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 内置函数时:

      如果没有提供名称,则读取的行存储在 REPLY 变量中。

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

    【讨论】:

    • 感谢您的回复!有没有办法将它与read 结合起来?它存在的原因是使原本会挂起的命令超时。 rpcinfo 也会发生这种情况:read -t1 &lt; &lt;(rpcinfo -t 10.0.128.1 nfs) if [ $? -eq 0 ] ; then _RET=true else _RET=false fi 如果无法访问 10.0.128.1,则 rpcinfo 本身会挂起几分钟。重定向到read 允许它在 1 秒内超时。正是在这种情况下——read——我很难抑制输出。
    • 呵呵..好的,接受! :) 你在同一时间发布了后续。
    • 另外,我不知道 read 的 REPLY 变量.. 非常有用,谢谢!
    • 即使 2>&- 生效,退出状态似乎仍然有效。 if [ $? -eq 0 ]; then ...if [[ -n "$REPLY" ]] ; then ... 行在使用 read -t1 使挂起的命令超时,并且在子shell 中使用 2>&- 来消除标准错误(如示例中所示)时,似乎同样有效。跨度>
    【解决方案2】:

    我想我明白了!您的回复中提到的重定向似乎在子shell 中起作用,而不会像 2>&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 良好时,输出所需的响应。

    我赞成你的回复!

    【讨论】:

      猜你喜欢
      • 2021-11-29
      • 1970-01-01
      • 1970-01-01
      • 2014-03-07
      • 2016-01-02
      • 2019-03-17
      • 2011-04-04
      • 2012-02-18
      相关资源
      最近更新 更多