Linux Servidor linux

Como agendar tarefas no Linux com o Crontab

Como agendar tarefas no Linux com o Crontab

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.

crontab no linux

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

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ã.

Crontab útil para agendar backup diariamente.
0 2 * * * /bin/sh backup.sh

Agendar para executar uma tarefa duas vezes no dia.

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.

É 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ã.

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.

*/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.

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
0 8 * jan,abr,jul,oct * /usr/bin/certbot renew &gt;&gt; /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.
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.
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(;).
* * * * * /scripts/script.sh; /scripts/scprit2.sh

Programar tarefas utilizando o parâmetro @[data].

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

Fazer backup da cron.

# crontab -l > backup-cron.txt

Restaurar o backup da cron.

# crontab backup-cron.txt

Espero ter ajudado a compreender e entender como funciona o Crontab.

Referências:

Tecadmin.net

comments powered by Disqus

Assine nossa Newsletter! 🐧

Se una com os assinantes de nossa Newsletter, sempre que tiver postagem nova você será notificado.