Executar um comando baseado na frequência stdout

1

Eu tenho um programa que escreve para stdout em um lote de texto muito rapidamente, mas a saída não tem uma saída específica para a qual eu possa escrever um loop esperado. Exemplo de stdout do meu programa:

[time:here] random text 1
[time:here] random text 2
[time:here] random text 3
[time:here] random text 4
[time:here] random text 5
[time:here] random text 6
[time:here] random text 7

Em seguida, ele espera até que eu interaja com ele e, em seguida, grava stdout novamente com o mesmo estilo de texto:

[time:here] random text 8
[time:here] random text 9
[time:here] random text 10
[time:here] random text 11
[time:here] random text 12
[time:here] random text 13
[time:here] random text 14

A stdout é impressa muito rapidamente, como em milissegundos, e depois há uma espera até eu interagir com ela. Uma vez que eu interajo o stdout é escrito novamente muito rápido, e aguarda. Isso se repete até eu fechar o programa.

Entre as esperas eu quero enviar um comando para gravar em outro arquivo a que horas eu interagi com o programa (usando echo ou algo similar).

Existe alguma maneira que eu possa direcionar o "wait" e fazer o comando echo após cada vez que houver uma espera pelo meu stdout? Por exemplo, se houver uma espera por > de 5 segundos, em seguida, execute o comando echo e espere o stdout mudar novamente?

    
por Blaze9 31.07.2017 / 22:29

1 resposta

1

Você pode usar uma leitura de bloqueio com um tempo limite para determinar quando a saída foi interrompida. Por exemplo, read do Bash suporta um parâmetro de tempo limite. O script a seguir irá escrever uma única linha se a saída de STDIN parar por mais de 2 segundos:

#!/bin/sh

while read -r firstline; do
    while read -r -t 2 line; do
        continue
    done
    echo "---- No data in 2 seconds ----"
done

O eco pode ser redirecionado para um log diferente e o script pode ser modificado para ecoar os dados sendo lidos de acordo com o padrão, se desejado.

    
por 01.08.2017 / 00:18