Personalize a maneira como stderr é anexado a um arquivo

1

Eu tenho um problema com um script de shell que usa o rsync para sincronizar 2 diretórios. Estou armazenando o resultado do comando rsync (seja ele bem-sucedido ou não) em um arquivo denominado status e, no caso de haver um problema, a saída stderr é anexada a um arquivo denominado error. No entanto, parece que não consigo encontrar uma maneira de inserir um registro de data e hora antes do erro real no arquivo de erros.

No final, preciso de algo assim:

if rsync source destination 2>> error # but I need to have the date before the actual error is appended!
then
   echo "'date' - Success" >> status
else
   echo "'date' - Failure" >> status
fi

Eu também tentei o seguinte:

(rsync source destination && echo "'date' - Success" >> status || echo "'date' - Failure" >> status) 2>>error

A única maneira de fazer isso funcionar é quando eu armazeno a saída stderr em um arquivo temporário, para que eu possa anexar seu conteúdo ao arquivo de erro depois que eu inserir o registro de data e hora.

    
por IG83 28.12.2011 / 10:19

3 respostas

1

Você já tentou isso?

rsync -av blah blah 2>&1|perl -e "while(<>){s/^/'date'  /g; print;}" >>logfile

Ele adicionará a data e alguns espaços ao início da linha.

    
por 30.12.2011 / 13:01
1

Eu sei que faz mais de três meses desde que fiz esta pergunta, mas achei que seria bom mostrar o que acabei fazendo no meu shell script.

Como eu descrevi, eu precisava de alguma forma pegar o stderr, para manipulá-lo em um arquivo de log, por exemplo. adicione um timestamp. Consegui fazer isso usando arquivos e com o que Patrick sugeriu, mas queria mantê-lo o mais simples possível.

Então, foi assim que eu trabalhei:

if ! result=$(command_that_will_produce_errors 2>&1 1>/dev/null)
then
    echo "There was an error on $(date): $result" >> logfile
else
    echo "Command executed successfully on $(date)" >> logfile
fi
    
por 21.04.2012 / 09:51
0

O Wiki de Greg tem uma entrada em adição de carimbos de hora a cada linha de um fluxo que abrange vários métodos, dependendo do seu ambiente . Todos eles baixam o fluxo através de um loop / processo que adiciona os timestamps; a versão compatível com POSIX é:

while IFS= read -r line; do
    echo "$(date +%Y%m%d-%H:%M:%S) $line"
done
    
por 29.12.2011 / 01:04