Olá pessoal, aqui uma dica bem rápida.
Já expliquei bastante sobre a importância que o Cron tem nos sistemas Unix-like, para agendar tarefas, scripts e comandos.
Agora, muitas vezes, precisamos saber se um determinado job rodou adequadamente, durante a noite por exemplo. Para isso, precisamos analisar o log.
Por padrão o syslog, (serviço do sistema que grava os logs), não salva os logs do cron em um arquivo dedicado.
Ele salva os logs do cron no arquivo /var/log/syslog, juntamente com outras informações do sistema.
Visualizando os Logs do Cron
Uma maneira inicial de visualizar e de filtrar os logs do cron contidos no arquivos de log (/var/log/syslog), é através do comando:
grep CRON /var/log/syslog
Este comando irá mostrar os jobs de todos os usuários.
Visualizando os Logs de Um Usuário Específico
Para mostrar apenas os jobs de um determinado usuário use este comando:
grep CRON.*\(usuário\) /var/log/syslog
Pesquisando Pelo Comando ou Script do Job
Para saber se um script específico que você agendou no cron, rodou, você pode procurar pelo comando ou script. Digamos que nosso script se chama backup.sh:
grep "backup.sh" /var/log/syslog
A saída do comando deve ser parecida com a abaixo, (e ela colocará cor no palavra-chave que você pesquisou usando o grep), e sempre nessa ordem:
Data / Nome da máquina / Nome do Processo e PID: usuário / comando
Jan 21 08:00:01 MEU_SERVER CRON[44553]: (suporte) CMD (/home/suporte/scripts/backup.sh)
Assim você saberá que as 8:00hs do dia 21 de Janeiro o comando/script “backup.sh” rodou usando o usuário suporte através do processo do cron no pid 44553.
Saber Se Um Job do Cron Rodou Em Um Horário Específico
O comando abaixo irá filtrar os jobs do cron que rodaram as 08 horas.
grep CRON “08:” /var/log/syslog | head -10
A saída deverá ser como
/var/log/syslog:Jan 21 08:00:01 SFL01 CRON[44553]: (usuário tal) CMD (comando tal)
/var/log/syslog:Jan 21 08:09:02 SFL01 CRON[47130]: (usuário tal) CMD (comando tal)
(…) e assim por diante
Habilitando Os Logs do Cron Também No Caminho /var/log/cron
Em 2 Passos
Passo 1 – Edite o arquivo abaixo com o seguinte comando.
nano /etc/rsyslog.d/50-default.conf
E então descomente a linha que aparece “#cron*”.
Observe abaixo que a linha está comentada (com o símbolo # antecedendo as letras)
Observe abaixo que agora, eu já a descomentei.
Passo 2 – Agora basta reiniciar o rsyslog com o comando:
sudo service rsyslog restart
Checando os Logs do Cron No Caminho Habilitado: /var/log/cron.
Pronto, agora adicionalmente ao syslog, os logs do cron também estarão registrados no arquivo var/log/cron.log
Para checá-los, basta visualizar este aquivo com cat ou com tail, (o tail mostra apenas as últimas linhas).
tail /var/log/cron.log
Editando Uma Tarefa do Cron Para Gravar Seu Log Em Um Outro Local e Arquivo Específico
Você pode direcionar a saída das tarefas individuais agendadas no cron, aos seus próprios registros para melhorar a legibilidade. Você só precisa especificar um arquivo de saída, redirecionando-o através do uso do símbolo “>”. Use o comando “crontab -e” para começar a editar suas tarefas.
Isso irá reescrever o arquivo de saída cada vez.
Se você gostaria de acrescentar a saída no final do arquivo em vez de uma reescrita completa, use colchete de fechamento duplo “>>”
0 15 * * * /home/cleuber/backup-diario.sh >> /home/cleuber/logs/backup-diario.log 2>&1
Acima vemos um cron que as 15:00hs, diariamente, roda um script chamado “backup-diario.sh” e seu log será armazenado em /homer/cleuber/logs/backup.log. (ou seja numa pasta chamada “logs” que criei em minha pasta “Home/pasta pessoal”.
(Para que sejam redirecionadas as saídas normais e saídas dos erros, ambas para o mesmo arquivo de log especificado, usei os parâmetros “2>&1”).
Legal não é?!
Registrando e Verificando o Tempo de Execução de Um Job do Cron
Registrando No Job:
Se você deseja saber o tempo que levou para concluir a execução de uma tarefa que rodou.
Imagine uma tarefa que faça o rsync de pasta entre dois servidores, ou faz a compactação de uma pasta com muitos gigabites de dados, e você quer saber quanto tempo a tarefa levou para terminar.
Então, para isso funcionar, você pode adicionar o parâmetro “time” antes do comando no cron.
Exemplo (registrando um arquivo de log em outro destino, e registrando a duração):
0 15 * * * time /home/cleuber/backup-diario.sh >> /home/cleuber/logs/backup-diario.log 2>&1
Obs. Lembre-se que o direcionamento da saída usando o símbolo “>” cria um arquivo de log e sobrescreve-o a cada execução do script, já usando dois símbolos “>>”, ele irá adicionando as saídas ao mesmo arquivo, criando uma lista que vai crescendo a cada execução. Lembre-se também que o parâmetro no final da linha “2>&1” coloca no arquivo as saídas que deram errado e as que deram certo, ok?
Visualizando o Tempo Decorrido:
A saída do tempo decorrido virá com dados de user e de system, mas o que a gente quer é o “elapsed” (traduzindo – “duração”).
Então se eu der um comando para visualizar o arquivo de log, ou seja, um cat (que mostra o arquivo todo), ou um tail (e usar o “-6” para mostrar as últimas 6 linhas), neste caso de exemplo:
tail -6 /home/cleuber/logs/backup-diario.log
Suponhamos que este script “backup-diario.sh”, por exemplo, compacte, usando o tar, dois arquivos (conteudo1.txt e conteudo2.txt) de uma pasta, então, podemos ver no log a saída desta forma:
tar: Removendo `/' inicial dos nomes dos membros /home/suporte/Documentos/teste/ /home/suporte/Documentos/teste/conteudo.txt /home/suporte/Documentos/teste/conteudo2.txt 1.16user 0.03system 0:01.20elapsed 98%CPU (0avgtext+0avgdata 5600maxresident)k 59840inputs+56496outputs (0major+826minor)pagefaults 0swaps
Reparou que na penúltima linha de saída, eu tenho o tempo de duração da tarefa (elapsed)?
Então, vemos que levou 1 minuto e 20 segundos.
Se preferir filtrar apenas o tempo de duração:
tail -6 /home/cleuber/logs/backup-diario.log | grep elapsed
A saída filtrada será como esta:
0.00user 0.00system 0:01.20elapsed
Obs. Apenas para reforçar – Usamos o “tail -6” porque pega o final do arquivo e queremos ver a última execução, mas você poderia usar um “cat”, caso, queira ver todas as durações de todas as tarefas que rodaram, ou no caso de estar usando o símbolo “>”, (ou invés do “>>”), o que faz ele sobrescrever o arquivo, então ele não gerará uma lista, e sim apenas o registro da última execução, então o cat, pode ser usado para mostrar porque vai ter apenas uma linha com o conteúdo “elapsed” que queremos. Mas aí fica ao seu critério.
Enviando o Log do Cron Para Um Endereço de E-mail
Pré-requisito
Primeiramente, um requisito é ter o pacote do postfix instalado.
Ao rodar um comando com parâmetro para enviar o log para um e-mail, e você não tiver o postfix instalado, o Linux em alguns casos poderá te alertar a instalar este pacote primeiro.
No caso do Ubuntu é assim. Então instale-o através do comando:
sudo apt-get install mailutils
Ele irá exibir dois passos ou telas, a primeira, você poderá deixar como “Site Internet” e a segunda o nome do seu domínio (pode deixar como está mesmo).
Feito isso, embora não usaremos este Linux como servidor de e-mails, ele já poderá encaminhar mensagens de e-mail para um endereço de e-mail comum como o gmail, hotmail, e etc, você que desejar.
Para todos os crons da sua conta:
Edite o cron, com o comando “crontab -e” e depois adicione a seguinte linha no começo do arquivo:
MAILTO=sua-conta@seu-email.com
Para Conta Nenhuma
Se quiser que ele não envie e-mail para lugar nenhum, nem para o local (/var/mail/sua-conta) basta deixar vazio.
MAILTO=""
Para Um E-mail Específico apenas em Um Job Específico
0 15 * * * time /home/cleuber/backup-diario.sh | mail -s "Status do Backup" sua-conta@seu-e-mail.com
Não Criando Logs de Uma Tarefa do Cron
Se você deseja que uma tarefa do Cron, não gere nenhum tipo de saída de logs, basta deixar o job assim:
0 15 * * * time /home/cleuber/backup-diario.sh > /dev/null 2>&1
Obs. Outros lugares que checamos os logs do cron:
/var/mail/seu usuário – aqui pode-se ver também o tempo de execução
/var/log/syslog – aqui vemos os logs de execução do cron
/var/log/cron – aqui vemos os logs de execução do cron
Outros artigos que falam sobre o Cron:
http://cleuber.com.br/index.php/2014/06/24/agendador-de-tarefas-cron-no-linux
script-para-backup-compactado-com-tar-e-gz-com-timestamp-agendado-via-cron
como-usar-o-comando-rsync-para-transferir-dados-para-diretorios-locais-e-remotos
Abraços,
Cleuber