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.
# vim /etc/crontab
# /etc/crontab: system-wide crontab
# Unlike any other crontab you don't have to run the `crontab'
# command to install the new version when you edit this file
# and files in /etc/cron.d. These files also have username fields,
# that none of the other crontabs do.
SHELL=/bin/sh
PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin
# Example of job definition:
# .---------------- minute (0 - 59)
# | .------------- hour (0 - 23)
# | | .---------- day of month (1 - 31)
# | | | .------- month (1 - 12) OR jan,feb,mar,apr ...
# | | | | .---- day of week (0 - 6) (Sunday=0 or 7) OR sun,mon,tue,wed,thu,fri,sat
# | | | | |
# * * * * * user-name command to be executed
17 * * * * root cd / && run-parts --report /etc/cron.hourly
25 6 * * * root test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.daily )
47 6 * * 7 root test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.weekly )
52 6 1 * * root test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.monthly )
#
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:
/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 :
# 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
Agora você irá compreender melhor o que falamos acima.
Crontab útil para agendar backup diariamente.
0 2 * * * /bin/sh backup.sh
Uma vez as 8:00 horas da manhã e às 20:00.
0 8,20 * * * /bin/bash
É dificil executarmos algum script todo minuto, mas talvez em alguns caso irá precisar.
* * * * * /bin/bash script.sh
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
*/20
é para executar o script a cada 20 minutos outro exemplo é para executar a cada 10 minutos */10
.
*/20 * * * */scripts/script.sh
0 */5 * * * /scripts/script.sh
Inclusive esta Crontab no post: Let’s Encrypt
0 8 * jan,abr,jul,oct * /usr/bin/certbot renew >> /var/log/le-renew.log
Este é um exemplo de como rodar em dias da semana especifico.
0 8 * * sun,sat /scripts/script.sh
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.
0 2 * * sun [ $(date +%d) -le 07 ] && /script/script.sh
Para rodar vários scripts, separe utilizando ponto e virgula(;).
* * * * * /scripts/script.sh; /scripts/scprit2.sh
Executar todo ano @yearly
- equivale ao timestamp: [ 0 0 1 1 * ]
Executar todo mês @monthly
- equivale ao timestamp: [ 0 0 1 * * ]
Executar toda semana @weekly
- equivale ao timestamp: [ 0 0 * * 1 ]
Executar todo dia @daily
- equivale ao timestamp: [ 0 0 * * * ]
Executar toda hora @hourly
- equivale ao timestamp: [ 0 * * * * ]
Ficaria da seguinte forma:
@hourly /scripts/script.sh
# crontab -l > backup-cron.txt
# crontab backup-cron.txt
Espero ter ajudado a compreender e entender como funciona o Crontab.
Se una com os assinantes de nossa Newsletter, sempre que tiver postagem nova você será notificado.