Encerre um pipeline se nenhum dado fluir por n segundos

Encerre um pipeline se nenhum dado fluir por n segundos

Eu tenho um software que produz dados no stdout por um tempo, depois continua em execução, mas não gera mais dados.

Eu tenho um pipeline que pega essa saída e a processa posteriormente, salvando a saída em um arquivo. No entanto, como o processo original continua em execução após terminar de produzir a saída, preciso encerrá-lo manualmente. Existe um comando que matará o programa em execução, uma vez que ele não produza nenhuma saída por alguns segundos?

Eu sei sobre o comando timeout, mas parece que ele opera em um tempo limite fixo. Não tenho uma maneira confiável de determinar por quanto tempo o software continuará produzindo.

Exemplo:

Suponha que eu tenha generate-dataesta aparência e não possa ser modificado. Na realidade, este é um software compilado que eu preferiria não modificar.

#! /usr/bin/env bash

for x in {1..5}; do
    echo $x
    sleep 1
done

while true; do sleep 1; done

Atualmente executo algo como ./generate_data | grep '[2-4]' > output, que produz a saída desejada, mas nunca termina.

Gostaria de encerrar o pipeline uma vez que generate_datanão produz nada por 2 segundos.

Responder1

Use o comando de leitura. A opção -t é sua amiga. Semelhante a isso

(echo "we:re:e";sleep 2;echo "d:dd:d") | while read -d ":" -t 2 a;do echo $a;done

A saída:

 we
 re
(echo "we:re:e";sleep 1;echo "d:dd:d") | while read -d ":" -t 2 a;do echo $a;done

A saída:

we
re
e d
dd

informação relacionada