Artigos > Trabalhando com Crontab

O Crontab (ou apenas Cron) é o agendador de tarefas do Linux. Nele podemos deixar programada a execução de comandos e/ou scripts, sendo possível especificar mês, dia do mês, dia da semana, hora e minuto da execução, o que nos permite agendar tarefas muito específicas.

Observação: Os agendamentos feitos no Crontab são chamados de tarefas (tasks), jobs ou mesmo cronjobs.

Neste artigo veremos como consultar tarefas existentes, entender como funcionam e como criar novas tarefas.

Consultando tarefas:

Geralmente uma tarefa fica agendada no Cron do próprio usuário, onde ele normalmente possui permissão para tanto.

Para consutar suas tarefas, basta executar o comando “crontab” com o parâmetro “-l” que listará eventuais tarefas.

crontab -l

Se nada for exibido, é por que não há tarefas agendadas. Do contrário, verá tarefas do Crontab como neste exemplo:

[raimundo@fenote ~]$ crontab -l
5 1 * * * /home/raimundo/scripts/backup.sh

Logo entenderemos tudo sobre esta tarefa, mas por ora saiba que, neste caso, o script “/home/raimundo/scripts/backup.sh” será executado diáriamente as 01:05 da manhã.

Ainda no exemplo anterior, com o parâmetro “-u” seguido do nome de outro usuário pode-se consultar tarefas desse outro usuário.

crontab -l -u raimundo

Visualizar tarefas de outros usuários requer certos privilégios que não são concedidos por padrão. Neste caso verá uma mensagem como esta:

[wil@fenote ~]$ crontab -l -u raimundo
must be privileged to use -u

Também podemos ter tarefas agendadas no arquivo /etc/crontab ou através de arquivos dentro do diretório /etc/cron.d/. Contudo, esses dois meios são comumente utilizados pelo usuário root, pois também requer privilégios.

O arquivo /etc/crontab é o principal e o mais utilizado, porém recomenda-se que mantenha suas tarefas em /etc/cron.d, onde os arquivos com as tarefas são lidos pelo Crontab tão logo os criamos e são executados de acordo com cada agendamento.

Dica: Pode ser uma boa prática separar tarefas em arquivos distintos considerando seus objetivos. Por exemplo, um arquivo chamado “backup” contendo apenas tarefas de backup ou um arquivo com o nome de um usuário contendo todas tarefas desse usuário.

Entendendo como funcionam os agendamentos no Crontab

Bom, agora vamos entender como funciona um agendamento de tarefa no Crontab. Primeiramente, observe a imagem abaixo. Ela nos permite visualizar a distinção de cada campo que compõem um Cronjob:

Agora vejamos novamente aquela tarefa agendada no Crontab do usuário “raimundo”:

[raimundo@fenote ~]$ crontab -l
.---------------- minuto (0 - 59)
| .------------- hora (0 - 23)
| | .---------- dia do mês (1 - 31)
| | | .------- mês (1 - 12) OR jan,feb,mar,apr ...
| | | | .---- dia da semana (0 - 6) (Domingo=0 ou 7)
| | | | |
5 1 * * * /home/raimundo/scripts/backup.sh

Portanto, se quizéssemos mudar esta tarefa para 12:30, alteríamos para:

30 12 * * * /home/raimundo/scripts/backup.sh

E se quizermos que este job seja executado somente às sextas-feira, alteraríamos para:

30 12 * * 5 /home/raimundo/scripts/backup.sh

Caractere “*” (asterísco)

O caractere “*” (asterísco) faz com que o campo onde ele é utilizado seja executado sempre que possível. Exemplo: Quando o utilizo no quinto campo, ou seja, no campo de dias da semana, estou dizendo que este job será executado todos os dias da semana. O mesmo valeria para “hora”, “minuto”, etc.

Caracteres “-” e “/” (hífen e barra)

Os caracteres “-” e “/” (hífen e barra) representam um intervalo de tempo. Vejamos dois exemplo de tarefas onde empregaríamos isso:

0 0-23/4 * * * rm -f /var/cache/appdir/*

Neste exemplo, no intervalo entre as horas 00 e 23, a cada 4 horas no minuto 0, será executado o comando “rm -f /var/cache/appdir/*”.

Para ficar claro, vejamos o outro exemplo onde especifico que entre 05:00 e 05:30 meu script “enviamail.php” será executado:

0-30/2 5 * * * php /home/wil/enviamail.php

Ou seja, entre os minutos 00 e 30 a cada 2 minutos e na hora 5 o script será executado.

Separando valores por vírgula

Podemos ainda utilizar uma vírgula para especificar uma possível repetição de um job em outro dia/hora. Como neste exemplo:

0-30/2 5,6,7 * * * php /home/wil/enviamail.php

Ou seja, é mesmo caso da tarefa anterior, onde o script enviamail.php será executado de 2 em dois minutos entre 05:00 e 05:30, porém, com o uso da vírgula, especifiquei que isso voltará ocorrer as 06 e 07. Ou seja, o script também será executado de 2 em 2 minutos entre 06:00 e 06:30 e entre 07:00 e 07:30.

Agendando tarefas

Agora que já sabe como o Crontab funciona, é hora de otimizar suas tarefas. Pense em algo simples de fazer e agende em seu usuário normal, sem privilégio de root. Para isso, basta executar o comando abaixo:

crontab -e

Seu editor de textos via CLI será executado (VIM ou NANO, por padrão). Crie sua tarefa e saia salvando. Verá uma mensagem como esta:

[wil@fenote ~]$ crontab -e
crontab: installing new crontab

Para confirmar, verifique sua tarefa foi criada com o comando “crontab -l”.

[wil@fenote ~]$ crontab -l
* * * * * echo "ok" ~/teste.txt

Criando tarefas em /etc/cron.d/

Com “root”, poderá criar jobs em /etc/cron.d/. Porém, deverá informar o usuário que executará esta tarefa entre o 5º campo e o campo do comando, como no exemplo da imagem acima. Agora, dê um nome sugestivo ao seu arquivo dentro de /etc/cron.d.

Logs

Os logs do Crontab podem ser logados tanto no “/var/log/syslog”, padrão para distribuições Debian-like, como em “/var/log/cron” que é padrão de Redhat-like. Caso algo dê errado no seu job, começar lendo esse log é uma ótima idéia.

Exemplos

No job abaixo, o script /sbin/backup.sh será executado nas 1, 2 e 3 de 5 em 5 minutos.

0-59/5 1,2,3 * * * /sbin/backup.sh

Eis uma outra forma de agendar a mesma rotina:

*/5 1,2,3 * * * /sbin/backup.sh

A seguir, o job será executado entre os minutos 0 e 30 de 2 em 2 minutos.

0-30/2 * * * * /sbin/backup.sh

O job abaixo será executado de minuto em minuto:
* * * * * /sbin/backup.sh

Deixe uma resposta

This site uses Akismet to reduce spam. Learn how your comment data is processed.