Home / Dicas e Tutoriais / Gerenciando os Logs do Cron

Gerenciando os Logs do Cron

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)

log1

Observe abaixo que agora, eu já a descomentei.

log2

Passo 2 – Agora basta reiniciar o rsyslog com o comando:

sudo service rsyslog restart

log3

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

About Cleuber

Cleuber Silva Hashimoto. Administrador

Leave a Reply

x

Check Also

Elementary OS 6 Odin Lançado – Confira as Novidades

Desenvolver um sistema operacional não é ...