Como detectar quando um comando em background é impresso em stderr?

0

Eu tenho este script (parcial) para gravar áudio:

#!/bin/sh
...
echo Recording to "$REC_FILE"
arecord [options] > "$REC_FILE" &
ARECORD_PID=$!

SYNC_COUNT=1
while kill -0 "$ARECORD_PID" > /dev/null 2>&1
do
        sleep 1
#        echo $SYNC_COUNT seconds
        sync
        SYNC_COUNT=$(($SYNC_COUNT+1))
done
echo Recording to "$REC_FILE" has ended.

que é chamado com record.sh >> "$LOGFILE" 2>&1 &

O motivo do relatório <number> seconds de 1 segundo é porque arecord não imprime informações de tempo com suas mensagens de erro em stderr . Então, com isso, tenho que olhar ou ouvir uma gravação inteira que pode levar várias horas para tentar encontrar o que pode ou não ser um problema.

Eu consertei esse problema imediato imprimindo o contador de 1 segundo no mesmo arquivo de log para que a mensagem de erro termine com um timestamp acima e abaixo no arquivo, mas isso realmente confunde as coisas porque é sempre executando, mesmo quando as coisas estão funcionando muito bem.

Como posso adicionar o valor presente do contador às mensagens de erro de arecord no arquivo de log sem sempre vomitar esse contador e sem atrapalhar a gravação de áudio em stdout como esta resposta parece fazer ? (ou isso?)

Em outras palavras, em vez disso, no arquivo de log, com o relatório do contador descomentado:

Recording to rec.wav
1 seconds
2 seconds
3 seconds
4 seconds
...
5093 seconds
arecord hiccuped but is still running
5094 seconds
...
10283 seconds
10284 seconds
Recording to rec.wav has ended.

Eu quero algo assim:

Recording to rec.wav
At 5093 seconds, arecord hiccuped but is still running
Recording to rec.wav has ended.

O formato exato do timestamp não importa, ou mesmo se estiver na mesma linha, contanto que eu ainda tenha a mensagem de erro original e a hora relativa ao início da gravação que aconteceu.

    
por AaronD 19.01.2017 / 04:08

1 resposta

2

Use o o utilitário ts (do pacote moreutils ) para saída de timestamp:

If the -i or -s switch is passed, ts timestamps incrementally instead.
In case of -i, every timestamp will be the time elapsed since the last
timestamp. In case of -s, the time elapsed since start of the program
is used.  The default format changes to "%H:%M:%S", and "%.S" and "%.s"
can be used as well.

Então, corra:

record.sh |& ts -s >> "$LOGFILE"
    
por muru 19.01.2017 / 04:31