O crontab, é um programa que agenda tarefas nos Sistemas Operacionais Linux e é bastante útil para automatizar a execução de certos processos no sistema, você edita o arquivo onde precisa ser atendido alguns parâmetros para executar um comando ou script. Onde é executado no sistema o (daemon) serviço cron, que é encarregado de verificar a data e hora e se existe algum programa a ser executado, caso exista ele rodará na data e hora solicitada, neste post irei ensinar a entender os parâmetros e os comandos que precisam ser executados. Primeiro iremos conhecer o arquivo do crontab.
1 2 3 |
# vim /etc/crontab |
Na imagem abaixo explico para que serve cada campo.
Quanto à edição do arquivo /etc/crontab, é importante considerar a utilização de alguns caracteres, os quais facilitarão o trabalho de agendamento:
• É necessário incluir uma linha em branco no final do arquivo para que o último comando seja executado;
• No campo que se refere aos dias da semana, o domingo pode ser representado pelo número 0 ou 7;
• No campo que se refere aos dias da semana, funciona também as três primeiras letras (em inglês) do dia da semana (sun,mon,tue,wed,thu,fri,sat);
• Os campos devem ser separados por um ou mais espaços ou tabulações;
• O asterisco (*) serve para especificar todo o intervalo disponível nos campos de data e hora;
• O hífen (-) é utilizado para especificar períodos de execução, incluindo o valor inicial e final;
• A vírgula (,) pode ser usada para especificar uma lista de valores;
• A barra (/) serve para especificar passos, ou seja, para inserir mais serviços que serão executados de acordo com o agendamento.
As tarefas que o usuário pretende agendar devem ser documentadas nas crontabs, que são tabelas verificadas a cada minuto pelo crond, com data e hora de execução indicadas para cada tarefa. As crontabs podem ser de usuário ou do sistema. O primeiro tipo fica armazenado no diretório /var/spool/cron/crontabs/<nomedousuario> e a crontab do sistema fica no /etc/crontab. Além disso, elas se diferem pelo fato de as crontabs de usuário trazerem a especificação de qual usuário irá executar a tarefa agendada. Para tarefas cuja hora exata não precise ser especificada, elas podem ser colocadas nos diretórios:
1 2 3 4 5 6 |
/etc/cron.hourly/ Para execução de hora em hora /etc/cron.daily/ Para execução diária /etc/cron.weekly/ Para execução semanal /etc/cron.monthly/ Para execução mensal |
Para o usuário comum executar tarefas através de comandos cron ele precisa estar listado no arquivo: /etc/cron.allow, basta colocar o nome do usuário, ou para impedir que o usuário execute tarefas, coloque o usuário no arquivo /etc/cron.deny. Em seguida iremos conhecer os parâmetros do comando crontab :
1 2 3 4 5 6 7 |
# crontab -l Lista as tarefas do usuário logado # crontab - u username -l Listar a cron de usuário especifico # crontab -e Abrirá o arquivo de cron do usuário # crontab - u username -e Editar a cron de usuário especifico # crontab -r Removerá a crontab do usuário |
Abaixo tem alguns exemplos úteis de crontab
Agora você irá compreender melhor o que falamos acima.
Agendar um cron para rodar todos dias as 2 horas da manhã.
1 2 3 4 |
Crontab útil para agendar backup diariamente. 0 2 * * * /bin/sh backup.sh |
Agendar para executar uma tarefa duas vezes no dia.
1 2 3 4 |
Uma vez as 8:00 horas da manhã e às 20:00. 0 8,20 * * * /bin/bash |
Agendar um cron para executar uma tarefa em cada minuto.
1 2 3 4 |
É dificil executarmos algum script todo minuto, mas talvez em alguns caso irá precisar. * * * * * /bin/bash script.sh |
Executar um cron para rodar todos os sábados às 8 horas da manhã.
1 2 3 4 |
Este tipo de cron é útil para fazer tarefas semanais, como rotação de log, etc. Observe que eu fiz das duas formas, com o número que representa a semana e usando as três primeiras letras da semana. 0 8 * * 7 /scripts/script.sh 0 8 * * sun /scripts/script.sh |
Agendar um cron para rodar a cada 20 minutos.
1 2 3 4 |
*/20 é para executar o script a cada 20 minutos outro exemplo é para executar a cada 10 minutos */10. */20 * * * */scripts/script.sh |
Agendar um cron para rodar a cada 5 horas.
1 2 3 |
0 */5 * * * /scripts/script.sh |
Agendar um cron para rodar de 3 em 3 meses às 8:00 da manhã.
Inclusive esta Crontab no post: Let’s Encrypt.
1 2 3 |
0 8 * jan,abr,jul,oct * /usr/bin/certbot renew >> /var/log/le-renew.log |
Agendar um cron para rodar sábado e domingo às 8 horas da manhã.
Este é um exemplo de como rodar em dias da semana especifico.
1 2 3 |
0 8 * * sun,sat /scripts/script.sh |
Agendar um cron para rodar no primeiro domingo de cada mês.
Para agendar um script para executar um script no primeiro domingo, não é possível por parâmetro de tempo, mas podemos usar a condição nos campos de comando para fazê-lo.
1 2 3 |
0 2 * * sun [ $(date +%d) -le 07 ] && /script/script.sh |
Rodar várias tarefas em um único cron.
Para rodar vários scripts, separe utilizando ponto e virgula(;).
1 2 3 |
* * * * * /scripts/script.sh; /scripts/scprit2.sh |
Programar tarefas utilizando o parâmetro @[data].
1 2 3 4 5 6 7 |
Executar todo ano @yearly - equivale ao timestamp: [ 0 0 1 1 * ] Executar todo mês @monthly- equivale ao timestamp: [ 0 0 1 * * ] Executar todo ano @weekly - equivale ao timestamp: [ 0 0 * * 1 ] Executar todo ano @daily - equivale ao timestamp: [ 0 0 * * * ] Executar todo ano @hourly - equivale ao timestamp: [ 0 * * * * ] |
Ficaria da seguinte forma:
1 2 3 |
@hourly /scripts/script.sh |
Fazer backup da cron.
1 2 3 |
# crontab -l > backup-cron.txt |
Restaurar o backup da cron.
1 2 3 |
# crontab backup-cron.txt |
Espero ter ajudado a compreender e entender como funciona o Crontab.