Cron e Crontab no Linux

Cron e Crontab no Linux são, de maneira geral, responsáveis por agendar e executar tarefas que o usuário pretenda que sejam executadas com determinada regularidade, seja uma ou várias vezes por minuto, hora, dia, mês e assim por diante. Com a adição do poder e vantagem que os scripts possibilitam (em qualquer linguagem que seja escrito) as possibilidades se tornam praticamente infinitas.

Suponhamos que você faça um backup (dump) de suas bases de dados MySQL todo santo dia às 5h da manhã. Não seria melhor que o próprio Linux fizesse esse backup automaticamente para você? É este tipo de conforto que o cron lhe da, simplesmente crie um script e agende no arquivo crontab para que ele seja executado todos os dias pela madrugada.

O exemplo acima poderia ser facilmente atingido se você colocar a seguinte linha no arquivo /etc/crontab:

0  5  *  *  *  usuario  /bin/bash '/caminho/mysql_dump.sh'

Mais adiante neste artigo vou entrar em maiores detalhes sobre a linha acima, mais primeiro vamos entender melhor o que é cron e crontab para que você saiba o que eles fazem e como trabalham juntos.

O cron do Linux

O Cron do Linux é um daemon que executa comandos ou scripts agendados por uma tabela chamada de crontab. Quando iniciado, ele procura por arquivos crontab (geralmente na pasta /var/spool/cron/crontabs) para carregá-los na memória. Além disso, o cron também lê o arquivo /etc/crontab e os arquivos em /etc/cron.d em busca de ainda mais tarefas a serem executadas em uma espécie de agenda.

Depois de tudo carregado na memória, o cron será executado minuto a minuto, examinando todos os crontabs armazenados e verificando cada comando para saber se algo deve ser executado no minuto atual.

Sendo multi-usuário, cada usuário pode ter uma tabela crontab diferente e o cron saberá quando deverá executar tais tarefas e quem será responsável pelas mesmas.

 E quanto ao Crontab?

Crontab é um arquivo que contém dados sobre quando um comando ou script deve ser executado e quem é seu responsável. Este é um arquivo de texto simples que recebe um formato especial para que o cron o entenda.

Para explicar de maneira simples, o arquivo crontab seria como uma agenda e o cron o dono dessa agenda, que a verifica minuto a minuto para ver se tem alguma tarefa a fazer.

Também existe um comando “crontab” que serve para criar crontabs de acordo com parâmetros passados a ele. É possível criar um crontab para cada usuário em específico, porém, vamos editar apenas o arquivo /etc/crontab (que nos dará praticamente as mesmas possibilidades) neste tutorial.

Cron e Crontab no Linux

Colocando em prática tudo o que você leu, a única coisa que você precisa fazer para agendar tarefas no Linux é adicionar uma linha no arquivo /etc/crontab. Cada linha é responsável por uma tarefa e deve ser escrita seguindo um formato específico para o Cron, caso contrário não vai funcionar.

O formato de cada linha segue o seguinte padrão:

(minuto) (hora) (dia do mês) (mês) (dia da semana) (usuário) (comando/script)

Cada trecho da linha acima deve ser separado por espaços. Por exemplo, se eu quero que algo seja executado dia 29/10 às 23:28, ficaria assim:

28 23 29 10 * luizotavio /bin/bash "/caminho/script.sh"

Veja mais detalhes sobre cada trecho da linha do arquivo /etc/crontab.

  • Minuto: de 0 a 59.
  • Hora: de 0 a 23;
  • Dia do mês: de 1 a 31;
  • Mês: de 1 a 12;
  • Dia da semana: de 0 a 7 (0 e 7 equivalem a domingo);
  • Usuário: O responsável pela tarefa;
  • Comando/Script: Um comando ou script que você deseja que seja executado.

Além dos trechos acima, você também pode utilizar alguns símbolos interessantes, por exemplo:

  • * (um asterisco): Significa que aquele trecho irá se repetir continuamente; Por exemplo, se eu adicionar um * no lugar dos minutos, a tarefa será executada a cada minuto;
  • – (um traço): Significa um range, por exemplo 1-5 equivale a 1,2,3,4 e 5;
  • / (uma barra): Indica saltos para um range, por exemplo */2 significa “de dois em dois”. Se eu colocar isso no lugar de minutos, a tarefa será executada de 2 em 2 minutos;
  • , (uma vírgula): Separa valores e ranges, por exemplo 1-2,10. Dessa maneira eu poderia falar que uma tarefa será executada às 8h da manhã e às 15h da tarde, ou quantas vezes eu precisar.

Vamos ver alguns exemplos práticos para facilitar a sua vida.

Exemplos de crontab no Linux

Os exemplos abaixo devem ser adicionados no arquivo /etc/crontab. Caso não saiba como editar tal arquivo, basta abrir seu terminal e digitar:

sudo nano /etc/crontab

Note que algumas distros Linux já trazem tarefas específicas no crontab, portanto, você deve adicionar suas novas linhas ao final do arquivo. Por exemplo, no Debian 8 você terá o seguinte:

# /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

# m h dom mon dow user  command
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 )

# SUAS NOVAS LINHAS VIRÃO AQUI EM BAIXO

Perceba que a última linha foi adicionada por mim. Além disso, entenda que o sinal de # (cerquilha) tem a função de caracterizar aquela linha como um comentário, ou seja, toda linha que tiver um # no início não será lida pelo cron do Linux. Isso é útil para que você possa documentar suas tarefas, escrevendo o motivo pelo qual você adicionou aquela linha no crontab. Assim fica mais fácil de lembrar posteriormente e não correr risco de adicionar ou remover algo erroneamente.

Veja abaixo alguns exemplos básicos e complexos de tarefas no crontab do Linux.

Se você quer que uma tarefa seja executada minuto a minuto, adicione o seguinte:

# Minuto a minuto
* * * * * usuario /bin/bash '/caminho/do/meu_script.sh'

De dois em dois minutos ficaria assim:

# De 2 em 2 minutos
*/2 * * * * usuario /bin/bash '/caminho/do/meu_script.sh'

De hora em hora (lembre-se que você precisa especificar os minutos):

# De hora em hora (Aos 7 minutos de cada hora)
7 * * * * usuario /bin/bash '/caminho/do/meu_script.sh'

De quatro em quatro horas:

# De 4 em 4 horas (Aos 10 minutos de quatro em quatro horas)
10 */4 * * * usuario /bin/bash '/caminho/do/meu_script.sh'

Todos os dias (agora você precisa especificar minutos e horas):

# Todos os dias (Às 8 e 12 da noite)
12 20 * * * usuario /bin/bash '/caminho/do/meu_script.sh'

De dois em dois dias:

# De 2 em 2 dias (Às 8 e 25 da noite)
25 20 */2 * * usuario /bin/bash '/caminho/do/meu_script.sh'

De dois em dois dias, porém com um range diferente:

# De 2 em 2 dias (Porém apenas dias ímpares)
25 20 1-31/2 * * usuario /bin/bash '/caminho/do/meu_script.sh'

Todo mês, no primeiro dia do mês:

# Todo mês, no primeiro dia do mês, à meia noite
0 0 1 * * usuario /bin/bash '/caminho/do/meu_script.sh'

Em uma data específica:

# 26/10/AAAA 20:35
35 20 26 10 * usuario /bin/bash '/caminho/do/meu_script.sh'

Todo domingo à meia noite:

# Todo domingo à meia noite (0 ou 7)
0 0 * * 0 usuario /bin/bash '/caminho/do/meu_script.sh'

Toda segunda em uma hora específica:

# Toda segunda às 20:43
43 20 * * 1 usuario /bin/bash '/caminho/do/meu_script.sh'

Utilizando um range de horas e um range de minutos

# Às 19, 20 e 21 horas, de 56 até 59 minutos das horas determinadas
56-59 19-21 * * * usuario /bin/bash '/caminho/do/meu_script.sh'

Utilizando um range mais complexo:

# 12, 13, 14, 16 e 17 horas, nos minutos especificados abaixo
# 1, 2, 3, 4, 5, 10, 50, 51, 52, 53, 54, 55 e 59
1-5,10,50-55,59 12-14,16,17 * * * usuario /bin/bash '/caminho/do/meu_script.sh'

Perceba que detalhei tudo o que a linha faz no comentário (a linha que contém uma #) assim você já vai se acostumando a documentar seu código.

Até o próximo!

0 respostas

Deixe uma resposta

Quer participar da conversa?
Sinta-se livre para contribuir!

Deixe uma resposta

O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *