Saída de stderr de correio, log stderr + stdout no cron

0

Eu quero que o cron envie apenas a saída do stderr, enquanto ao mesmo tempo registre o stdout + stderr, na ordem correta, em um arquivo.

Eu tenho mexido com tee e os gostos, mas não entendi direito ...

Não há problema em colocar o comando em um script de shell

Como

#!/bin/bash
mycommand | maybe_some_shell_redirect_magic >> /var/log/mycommand.log
    
por Magnus Stenman 21.08.2018 / 15:36

2 respostas

1

Eu acho que é possível - enquanto mantém a ordem de linha (ou seja, stderr é copiado de dentro do processo onde está escrito), mesmo com um shell POSIX. Experimente:

#!/bin/sh

exec 3>log
command args ... 2>&1 >&3 |while read err; do
  echo "$err" >&2
  echo "$err" >&3
done
    
por 18.09.2018 / 23:13
0

Não é possível manter o pedido com precisão ao separar stdout e stderr. Você pode obter resultados razoáveis com isso, desde que a temporização das saídas stdout e stderr não seja muito próxima:

mycommand 2>>/var/log/mycommand.log | tee -a /var/log/mycommand.log

Você pode testá-lo com este script no lugar do mycommand:

#!/bin/bash
echo stdout 1
sleep 0.1
echo stderr 1 >&2
sleep 0.1
echo stdout 2
sleep 0.1
echo stderr 2 >&2

Se você remover os comandos sleep, a ordem no arquivo de log será um pouco confusa.

    
por 21.08.2018 / 17:06