julho 24, 2019

Utilizando o cron para agendar tarefas

No último artigo, eu falei sobre o uso do notify-send com o cron, mas é bem provável que você tenha ficado em dúvida sobre o que é e como utilizar o cron, e é disso que eu pretendo tratar aqui.

De forma resumida, o cron é um programa que roda nos bastidores do sistema, o que nós chamamos de daemon, cuja finalidade é executar comandos agendados. Ele é iniciado automaticamente com o boot da sua máquina e está presente em todos os sistemas Unix-like, inclusive no Linux.

Para interagir com ele, existe um arquivo chamado crontab (de cron table), que é basicamente uma tabela em texto puro contendo todas as tarefas (jobs, ou cronjobs) agendadas. O sistema, portanto, já vem com essa tabela configurada para realizar todas as tarefas periódicas que precisem ser executadas globalmente. Mas você, como usuário, também tem acesso à criação da sua própria tabela, e isso é feito através do comando de terminal que tem o mesmo nome do arquivo: o comando crontab.

Executando o comando crontab -h, que na verdade é uma opção inválida, faz com que o comando exiba o seu uso e as opções disponíveis:

De modo geral, para criar uma entrada na tabela apenas para o seu usuário, basta executar o comando...

crontab -e

Se quiser criar uma crontab para outros usuários, basta executar...

crontab -u nome_do_usuário -e

Por definição, este é o comando para editar a tabela de agendamentos do seu usuário. Se ela não existir, será criada, e você terá a opção de escolher o editor de textos da sua preferência.

No Debian, como a própria mensagem da imagem indica, caso você se arrependa da escolha que fez, basta executar o comando select-editor no terminal que o menu com as opções será exibido novamente.

Quando você cria a sua crontab, o seu arquivo contém apenas algumas informações introdutórias. Você pode lê-las e apagá-las se quiser.

Para entrar com um novo agendamento na sua crontab, digitar uma linha contendo as seguintes informações neste formato:

┌───────────── minuto (0 - 59)
│ ┌───────────── hora (0 - 23)
│ │ ┌───────────── dia do mês (1 - 31)
│ │ │ ┌───────────── mês (1 - 12)
│ │ │ │ ┌───────────── dia da semana (0 - 6) (Domingo a Sábado)
│ │ │ │ │
│ │ │ │ │
│ │ │ │ │
* * * * * comando a ser executado

* = todas as correspondências do campo

Um detalhe importante, é que todos os valores aqui se referem a datas e horas marcadas, como as horas e minutos de um relógio ou os dias e meses do calendário, e não a durações ou intervalos. Então, se eu escrevo "5" no primeiro campo, eu estou me referindo ao minuto 5 do relógio, e não a um intervalo regular de 5 minutos.

Nesta imagem, você pode ver a minha crontab atual.

Exemplos

A melhor forma de entender a sintaxe do crontab é através de alguns exemplos práticos.

1. Executar uma tarefa todos os dias num dado horário

15 14 * * * comando a ser executado

Isso irá agendar a execução de um comando todos os dias às 14:15h. Outro exemplo:

0 7 * * * comando a ser executado

O comando será executado todos os dias às 7h da manhã.

Mas, cuidado! se você puser um asterisco no primeiro campo em vez do "0" quando quiser se referir ao minuto zero de cada hora, o cron irá entender que o comando deverá ser executado todos os minutos da hora indicada!

2. Executar uma tarefa várias vezes por dia

0 8,15 * * * comando a ser executado

O comando será executado às 8h e às 15h.

0 2,8,14,20 * * * comando a ser executado

O comando será executado quatro vezes ao dia, às 2h, 8h, 14h e 20h. Neste caso, estamos falando de um intervalo constante de seis horas das 2h da madrugada às 20h, o que poderia ser melhor descrito com a opção de indicar "passos" (steps) e "intervalos", assim...

0 2-20/6 * * * comando a ser executado

Neste exemplo, o resultado seria o mesmo de antes, mas nós representamos o intervalo como 2-20 e o passo de seis horas como /6.

3. Executar um comando todos os minutos de todas as horas do dia

* * * * * comando a ser executado

Obviamente, isso não parece prático, mas pode ser uma boa forma de testar os comandos que você deseja que o cron execute.

4. Executar comandos numa determinada hora de segunda à sexta

30 17 * * 1-5 comando a ser executado

Aqui, o comando será executado às 17:30h todos os dias de segunda à sexta. Repare que nós utilizamos a representação de intervalos no campo do dia da semana, onde "1" é segunda e "5" é sexta.

5. Executar um comando a cada "n" dias

0 0 * * */2 comando a ser executado

O comando será executado à meia-noite em dias alternados começando no domingo.

0 17 * * 1/2 comando a ser executado

O comando será executado às 17h em dias alternados de segunda a domingo.

Outras ideias

Os exemplos acima são suficientes para deduzir as demais possibilidades da sintaxe do crontab. Mas, às vezes, nós podemos enfrentar algumas situações mais peculiares onde a sintaxe sozinha não irá resolver.

Nesses casos, nós podemos simplesmente recorrer ao campo do comando a ser executado para realizar algumas filtragens, como veremos no próximo exemplo.

Executar um comando na primeira quarta-feira de cada mês

A ideia aqui é utilizar o comando test em conjunto com o agendamento para verificar se a quarta-feira em questão (dia da semana 3) corresponde a um dia do mês é menor do que o dia 7. O teste seria feito assim:

[ $(date +d%) -le 07 ] && comando a ser executado

A parte entre colchetes ([...]) é o comando test. Nele, nós pedimos a data de hoje (comando date) formatada de modo a retornar apenas o dia do mês (+d%). Em seguida, o dia retornado é testado para ver se é menor ou igual a "07" (-le). Caso seja verdadeiro, tudo que vier depois será executado (&& comando a ser executado).

Colocando tudo na nossa crontab...

0 12 * * 3 [ $(date +d%) -le 07 ] && comando a ser executado

O comando será executado ao meio-dia de uma quarta se o dia do mês for menor ou igual a 7.

Executar vários comandos numa única linha

20 11 * * * comando1; comando2; ... comando n

Ou assim...

20 11 * * * comando1 && comando2 && ... comando n

 

Outras ações...

 

Ver a sua crontab atual

$ crontab -l

Salvar a sua crontab em um arquivo

$ crontab -l > minha-crontab.txt

Restaurar a sua crontab a partir de um arquivo

$ crontab /caminho/minha-crontab.txt

Remover sua crontab

$ crontab -r

Onde treinar?

Existe um site muito bom para você testar a sintaxe dos seus agendamentos, o crontab guru.

 

Dúvidas? Correções? Outras dicas? Fique à vontade para comentar!

 

 

Nenhum comentário:

Postar um comentário

O sistema de comentários do Blogspot é um lixo e praticamente me obriga a liberar ou moderar todos os comentários. Portanto, eu peço perdão antecipadamente caso o seu comentário demore para aparecer.

Mas não se acanhe por causa disso! :-)