首页 > 解决方案 > 如何使用计时器监控命令的标准输出?

问题描述

我想知道应用程序何时没有在标准输出中打印一行 N 秒。

这是一个可重现的示例:

#!/bin/bash
dmesg -w | {
  while IFS= read -t 3 -r line
  do
    echo "$line"
  done
  echo "NO NEW LINE"
}
echo "END"

我可以看到NO NEW LINE但管道没有停止并且 bash 没有继续。END从不显示。

资料来源:https ://unix.stackexchange.com/questions/117501/in-bash-script-how-to-capture-stdout-line-by-line

标签: bashshell

解决方案


如何退出方括号的代码?

并非所有命令在无法写入输出或接收SIGPIPE时都会退出,并且在真正注意到无法写入输出之前它们不会退出。相反,在后台运行该命令。如果打算wait在进程上,在 bash 中你可以只使用进程替换:

{ 
     while IFS= read -t 3 -r line; do
        printf "%s\n" "$line"
    done
    echo "end"
} < <(dmesg -w)

您也可以使用协同处理。或者只是在后台使用管道运行命令,kill然后在完成后运行。


推荐阅读