如何在第一场比赛或超时之前输送一个持久的命令?

时间:2017-04-25 15:36:58

标签: bash shell unix

我有一个设备的远程系统日志记录器,如果存在条件,则每隔大约15秒左右就会包含一个特定的字符串。它可以通过运行它来检测:

(timeout 20 remote-logger 2>&1) | grep -m 1 KEY

(使用更高的超时值来补偿潜在的抖动)

如果先前找到KEY字符串,有没有办法将其短路?

1 个答案:

答案 0 :(得分:2)

在带有GNU工具链的bash 4.4中,您可以执行以下操作:

exec 3< <(stdbuf -oL remote-logger | grep --line-buffered -m 1 KEY); pid=$!
read -t 20 -r key <&3
kill "$pid"

在4.4之前,$!无法捕获流程替换的PID,因此您无法执行kill - 但其他部分应该有效

顺便提一下,您也可以在shell中进行本地过滤(吞吐量较低,但管道启动成本较低):

result=
while IFS= read -r line; do
  case $line in
    *KEY*) result=$line;;
    *) continue;;
  esac
done < <(timeout 20 remote-logger)