Da minha saída de script, quero capturar TODOS os dados de logs com mensagens de erro e redirecioná-los para o arquivo de log.
Eu tenho script como abaixo:
#!/bin/bash
(
echo " `date` : part 1 - start "
ssh -f [email protected] 'bash /www/htdocs/server.com/scripts/part1.sh logout exit'
echo " `date` : sleep 120"
sleep 120
echo " `date` : part 2 - start"
ssh [email protected] 'bash /www/htdocs/server.com/scripts/part2.sh logout exit'
echo " `date` : part 3 - start"
ssh [email protected] 'bash /www/htdocs/server.com/scripts/part3.sh logout exit'
echo " `date` : END"
) | tee -a /home/scripts/cron/logs
Quero ver todas as ações no arquivo/home/scripts/cron/logs
Mas só vejo isso o que coloco após o echo
comando.
Como verificar nos logs que o SSH
comando foi bem-sucedido?
Eu preciso reunir todos os 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.
Eu geralmente coloco algo semelhante ao seguinte no início de cada script (especialmente se ele for executado como um daemon):
Explicação:
exec 3>&1 4>&2
Salva descritores de arquivo para que possam ser restaurados para o que eram antes do redirecionamento ou usados para produzir o que eram antes do redirecionamento a seguir.
trap 'exec 2>&4 1>&3' 0 1 2 3
Restaurar 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 arquivolog.out
e depois redirecionestderr
parastdout
. Observe que a ordem é importante quando você deseja que eles vão para o mesmo arquivo.stdout
deve ser redirecionado antesstderr
de 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
stdout
foi direcionado, presumivelmente o console, antes de executar a linha 3 acima.Enquanto 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 login no arquivo desejado com:
sh -x foo.sh >> /home/scripts/cron/logs
para obter a saída ssh para seu arquivo de log, você deve redirecionar
stderr
parastdout
. você pode fazer isso anexando2>&1
após seu script bash.deve ficar assim:
quando isso não exibir as mensagens na ordem correta, tente adicionar outro subshell:
No bash, você pode colocar
set -x
e imprimir todos os comandos que executa (e as variáveis do bash) depois disso. Você pode desativá-lo comset +x
.Se você quer ser paranóico, você pode colocar
set -o errexit
em 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ê quiser obter logs melhores, você deve olhar no
ts
pacotemoreutils
debian/ubuntu. Ele irá prefixar cada linha com um carimbo de data/hora e imprimi-lo. Então você pode ver quando as coisas estavam acontecendo.Seguindo o que outros disseram, o manual do conjunto é um bom recurso. Eu coloco:
No topo dos scripts, desejo continuar, ou
set -ex
se deve sair em caso de erro.Descobri que a resposta @nicerobot ( Como posso registrar totalmente todas as ações de scripts bash? ) pode não ser suficiente para redirecionar completamente toda a saída para o console. Alguma saída ainda pode ser perdida.
O redirecionamento completo fica assim:
Explicação :
echo
chamadas internas para o console e para o arquivo, portanto, o pipe-plus-tee é a única maneira de dividir o fluxo de saída.(...)
operador para redirecionar cada fluxo para um arquivo autônomo ou para restaurar todos os fluxos de volta ao original por etapas separadas. A segunda razão porquemyfoo
as chamadas antes da auto-reentrada precisam funcionar como estão, sem nenhum redirecionamento adicional.NEST_LVL
variável para indicar o nível de chamada do ninho.IMPL_MODE
variável.TL;DR - Ontem escrevi um conjunto de ferramentas para registrar execuções e sessões de programas.
Atualmente disponível em https://github.com/wwalker/quick-log
Como administrador, estou sempre querendo registrar a saída de algum comando, geralmente não um script. Para resolver esse problema, escrevi algumas coisas. O mais fácil é usar o programa "script" como mencionou xX0v0Xx. Descobri que chamar script (sem argumentos) muitas vezes resultaria em substituir a saída de um script anterior. Então eu criei este alias. Tudo o que faz é evitar a substituição. Você precisa de um diretório ~/tmp.
Isso é ótimo quando quero pegar uma sessão interativa.
Quando quero registrar a saída de um comando (script ou binário), quero a saída exata ou quero a saída com timestamps na frente de cada linha. Então eu escrevi essas duas funções bash:
Basta executar seu comando como faria normalmente:
ou
Isso acabou de criar 2 arquivo chamado:
Mas, espere que tem mais!!
Eu não queria ter que fazer um ls para encontrar o nome do arquivo de log que justlog ou timelog acabou de criar para mim. Então, eu adicionei mais 3 funções:
Então, você executa seu comando com justlog (ou timelog) e, em seguida, basta usar lesslog ou viewlog (provavelmente criarei um log do emacs para essas pessoas):
É isso, não
ls ~/tmp
, não há jogos de conclusão de guias para encontrar o nome do arquivo. Basta executar lesslog (ou viewlog se você gosta de usar o vim para ver os logs).Mas espere! Tem mais!
"Eu uso grep o tempo todo em meus arquivos de log" - E a resposta é, você adivinhou,
greplog
Primeiro, obtenha o texto de todos os arquivos /etc/cron.d/atop do servidor 800 que estão quebrados:
Em seguida, obtenha os nomes de host (na linha acima da saída no arquivo :-) ) com greplog:
Você pode simplesmente usar "script".
man script
para detalhes.Exemplo:
Então, aqui está uma opção que usei e considero um pouco mais amigável. Essencialmente, defina uma função de tarefa na parte superior de seu script e defina todas as suas seções com suas próprias funções para serem passadas para chamadas da função de tarefa. Ele também pode ser estendido para adicionar alguns sinalizadores específicos de INFO, WARN, DEBUG e ERROR para seus logs. Elas seriam simplesmente funções que usam um echo para encapsular sua mensagem de maneira consistente, já que todas as saídas vão para o seu log de qualquer maneira.
Ficaria algo assim:
LIMITAÇÕES e CUIDADO :