Quero capturar TODOS os dados dos logs, ambos com mensagens de erro, da saída do meu script e redirecioná-los todos para o arquivo de log.
Eu tenho script como abaixo:
#!/bin/bash
(
echo " `date` : part 1 - start "
ssh -f admin@server.com 'bash /www/htdocs/server.com/scripts/part1.sh logout exit'
echo " `date` : sleep 120"
sleep 120
echo " `date` : part 2 - start"
ssh admin@server.com 'bash /www/htdocs/server.com/scripts/part2.sh logout exit'
echo " `date` : part 3 - start"
ssh admin@server.com 'bash /www/htdocs/server.com/scripts/part3.sh logout exit'
echo " `date` : END"
) | tee -a /home/scripts/cron/logs
Eu quero ver todas as ações no arquivo /home/scripts/cron/logs
Mas vejo apenas isso o que coloquei após o comando echo.
Como fazer check-in dos logs, o comando SSH foi bem-sucedido?
Eu preciso reunir todos os dados dos logs. Eu preciso disso para monitorar o resultado de cada comando no meu script, para analisar melhor o que está acontecendo enquanto o script falha.
Respostas:
Geralmente, coloco algo semelhante ao seguinte no início de cada script (especialmente se for executado como um daemon):
Explicação:
exec 3>&1 4>&2
Salva os descritores de arquivo para que possam ser restaurados para o que eram antes do redirecionamento ou usados para gerar a saída para o que eram antes do redirecionamento a seguir.
trap 'exec 2>&4 1>&3' 0 1 2 3
Restaure os descritores de arquivo para sinais específicos. Geralmente não é necessário, pois eles devem ser restaurados quando o sub-shell sair.
exec 1>log.out 2>&1
Redirecione
stdout
para o arquivo elog.out
depois redirecionestderr
parastdout
. Observe que o pedido é importante quando você deseja que eles acessem o mesmo arquivo.stdout
deve ser redirecionado antes destderr
ser redirecionado parastdout
.A partir de então, para ver a saída no console (talvez), você pode simplesmente redirecionar para
&3
. Por exemplo,irá para onde quer que tenha
stdout
sido direcionado, presumivelmente para o console, antes de executar a linha 3 acima.fonte
trap 'exec 2>&4 1>&3' 0 1 2 3 RETURN
. Os pseudo-sigspec RETURN restauram descritores de arquivo sempre que uma função shell ou um script é executado com o. ou a fonte builtins termina a execução. Por isso (e por outras razões) em meus scripts, adiciono as duas últimas linhas:return
&exit 0
- Apenas meus 2 centavos, parabéns a você @nicerobot!trap
sinais parece um pouco estranha. Normalmente você também vai querer incluir15
.para obter a saída ssh para o seu arquivo de log, você deve redirecionar
stderr
parastdout
. você pode fazer isso anexando2>&1
após o script bash.deve ficar assim:
quando isso não exibir as mensagens na ordem correta, tente adicionar outro subshell:
fonte
( ... ) |& tee output.log
Enquanto eu leio sua pergunta, você não deseja registrar a saída, mas toda a sequência de comandos; nesse caso, as outras respostas não o ajudarão.
Invoque scripts de shell com -x para produzir tudo:
sh -x foo.sh
Faça logon no arquivo que você deseja:
sh -x foo.sh >> /home/scripts/cron/logs
fonte
No bash, você pode colocar
set -x
e ele imprimirá todos os comandos que ele executar (e as variáveis do bash) depois disso. Você pode desligá-lo comset +x
.Se você quer ser paranóico, pode inserir
set -o errexit
seu script. Isso significa que o script falhará e será interrompido se um comando retornar um código de saída diferente de zero, que é a maneira padrão do unix de sinalizar que algo deu errado.Se você deseja obter logs mais agradáveis, consulte
ts
omoreutils
pacote debian / ubuntu. Ele irá prefixar cada linha com um carimbo de data e hora e imprimi-lo. Então você pode ver quando as coisas estavam acontecendo.fonte
Seguindo o que outros disseram, o manual do conjunto é um bom recurso. Eu coloco:
Na parte superior dos scripts, desejo continuar, ou
set -ex
se ele sair após erro.fonte
ssh -vv
?