![如果 n 秒内没有数据流,则终止管道](https://linux22.com/image/197355/%E5%A6%82%E6%9E%9C%20n%20%E7%A7%92%E5%86%85%E6%B2%A1%E6%9C%89%E6%95%B0%E6%8D%AE%E6%B5%81%EF%BC%8C%E5%88%99%E7%BB%88%E6%AD%A2%E7%AE%A1%E9%81%93%20.png)
我有一个软件,可以在标准输出上生成数据一段时间,然后继续运行,但不再输出任何数据。
我有一个管道,可以获取该输出并进一步处理它,将输出保存在文件中。但是,由于原始进程在完成生成输出后继续运行,因此我必须手动终止它。是否有一个命令会在运行的程序在几秒钟内没有产生任何输出时终止它?
我知道超时命令,但看起来它是在固定超时下运行的。我没有可靠的方法来确定软件将保持输出多长时间。
例子:
假设我的generate-data
内容看起来像这样并且无法修改。事实上,这是一个我不想修改的编译软件。
#! /usr/bin/env bash
for x in {1..5}; do
echo $x
sleep 1
done
while true; do sleep 1; done
我目前运行类似的东西./generate_data | grep '[2-4]' > output
,它会产生我想要的输出,但永远不会终止。
我想终止管道一次,generate_data
2 秒内不输出任何内容。
答案1
使用读取命令。 -t 开关是你的朋友。类似这个
(echo "we:re:e";sleep 2;echo "d:dd:d") | while read -d ":" -t 2 a;do echo $a;done
输出:
we
re
(echo "we:re:e";sleep 1;echo "d:dd:d") | while read -d ":" -t 2 a;do echo $a;done
输出:
we
re
e d
dd