
Eu tenho 3 scripts em /etc/cron.daily
. Meus logs cron são escritos em /var/log/cron
. A seguir está uma entrada para o cron acima que foi executado.
(root) CMD (run-parts /etc/cron.hourly)
Aqui o stdout
ou stderr
dos scripts dentro do cron não está disponível, isso mostra que o run-parts
comando foi executado nesta pasta.
Existe algum truque que possa ajudar a registrar o que aconteceu enquanto os três scripts foram executados?
NOTA: Não consigo editar os scripts cron.daily
para redirecionar saídas e erros para um arquivo de log.
Responder1
No Unix, o sistema de correio é o meio pelo qual as notificações do sistema são entregues aos usuários. Você pode pensar nisso como no Windows, onde algo será exibido na barra de tarefas com uma mensagem pop-up se precisar notificá-lo sobre algo. Como os cronjobs (teoricamente) não deveriam produzir nenhuma saída (já que ninguém deveria estar lá para vê-la), qualquer saída (stdout ou stderr) é tratada como se fosse uma possível indicação de um erro ou problema e, portanto, um email é enviado para o proprietário do cronjob para solicitar que eles verifiquem.
Assim, toda a saída (stdout e stderr) é enviada através do sistema de correio local para o proprietário do cronjob. Se o proprietário for uma conta não pessoal, você poderá direcionar o MTA local para retransmitir para uma conta de e-mail real configurando um alias. Por exemplo, adicionei a /etc/aliases
:
root: [email protected]
Em seguida, executei o newaliases
comando (para reconstruir o banco de dados de aliases de correio). Depois disso, comecei a receber emails do root na caixa de entrada do meu email corporativo:
root@xxxxxxvlp05 ~ $ echo "the game" | mutt root -s "No Diggity"
sendmail: warning: inet_protocols: IPv6 support is disabled: Address family not supported by protocol
sendmail: warning: inet_protocols: configuring for IPv4 support only
postdrop: warning: inet_protocols: IPv6 support is disabled: Address family not supported by protocol
postdrop: warning: inet_protocols: configuring for IPv4 support only
Então essa é a maneira mais ou menos normal (permitir que o sistema envie e-mails de notificação). Existem outros meios de lidar com a notificação. Algumas alternativas:
Modificando aliases para salvar os e-mails em um arquivo específico:
root: /var/log/rootMails
Canalizando o e-mail para um script:
root: |/usr/local/bin/filterMail
Uma alternativa para mexer com aliases é usar a MAILTO=
opção dentro do crontab do usuário que muitos daemons cron suportam. Isso pode ser preferível se você quiser receber apenas um conjunto específico de notificações do usuário, e não qualquer coisa que será descartada em sua caixa de correio (que é o que aliases
acontece).
Tenho certeza de que há muitos outros, mas você provavelmente desejará fazer o primeiro ou o último.
Responder2
Você pode executar o cron com a -s
opção de usar o syslog em vez de enviar e-mails. Isso funciona pelo menos no RHEL e seus derivados, FreeBSD e MacOS.
Responder3
Você pode fazer login dentro de um script bash:
logfile=/var/log/mine/whatever.log
log () {
timestamp=$(date +'%F %T')
echo -e "$timestamp $1" >> $logfile
shift
for a; do
echo -ne "$a" >> $logfile
done
}
log "Hello world.\nAnd so on..."
[...]
Se você estiver executando comandos que possuem saída que deseja registrar:
somecommand 2>&1 >> $logfile
Você também pode enviar mensagens e erros para o registrador do sistema (consulte Recursos man logger
) e potencialmente classificá-los por meio da configuração do syslog.