
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-data
esta 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_data
nã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