Crontab

Domine a gestão de processos agendados de seus sistemas baseados em linux com o Cron e sua ferramenta crontab!


| Se você apoia nosso site, desative o AdBlock quando visitá-lo, inclusive em Mobile!
Os anúncios são poucos e não invasivos. Se quiser contribuir com nosso trabalho, clique em qualquer banner de sua preferência, exceto dos Parceiros. 
Mais detalhes clicando aqui.


Introdução

O Cron é um agendador de processos, serviços e tarefas, baseado em tempo, sendo nativo de todos os sistemas baseados em UNIX. Originalmente desenvolvido para o BSD, foi portado para o Linux e hoje é uma importante ferramenta para administradores de sistema.

Seu objetivo é programar a execução de processos, serviços ou tarefas – Shell Scripts ou Python, por exemplo – dando uma gama de opções granulares para sua configuração, que apesar de apresentar uma sintaxe que num primeiro momento possa soar confusa, é prática e direta. Uma curiosidade está na origem do nome, cron é da palavra grega Chronos (χρόνος) para tempo.

Lembrando, que o Cron é útil para agendar tarefas que vão ser realizadas repetidas vezes periodicamente, como um backup ou uma restauração. Para agendar uma tarefa que será executada uma única vez, é preferível o uso do comando at, que será abordado em um outro post futuro.

1. Crontab

O Crontab é nossa estrela da postagem por ele ser o editor de agendamento do Cron, que pode ser ajustado com o Vim, Nano ou Emacs. Em nosso tutorial, mostrarei o uso com o Nano.

Existem 2 serviços do Cron nos sistemas UNIX. Um, é executado pelo root. Outro, por um usuário comum.

Seus principais parâmetros são:

-l usuário - lista as tarefas agendadas para o usuário
-e usuário - edita o agendador
-r usuário - apaga o arquivo do usuário
-c diretório - especifica um diretório diferente para o Crontab

Os parâmetros em negrito são opcionais.

Exemplos:

$ crontab -e # Editar o Cron

ou

$ crontab -e administrador # Usuário Administrador editará o Cron

$ sudo crontab -e # SuperUsuário editará o Cron de SuperUsuário

Qualquer tarefas agendada pelo SuperUsuário será executada com permissões de root numa listagem diferente daquela criada por um usuário comum. Se a tarefa envolve backup da pasta /etc por exemplo, ela deve ser programada pelo crontab como sudo e não o crontab comum.

2. Editando

Abra seu terminal e digite:

$ crontab -e

Se você está executando ele á primeira vez, terá que escolher entre 1 dos 3 editores de texto oferecidos.
Aqui, usaremos o Nano como exemplo, opção 1. Digite 1 e dê Enter.

Basta dar Enter após todo o texto – ou apague tudo, se preferir.
Aqui você impõe apenas 5 valores numéricos iniciais e em seguida o comando que deseja executar:

* * * * * /caminho/do/script.sh

3. Sintaxe

O Cron quando editado apresenta uma sintaxe simples. Sendo:

mm hh dd MM ss /caminho/do/script.sh
  • mm = minuto(0-59)
  • hh = hora(0-23)
  • dd = dia(1-31)
  • MM = mes(1-12)
  • ss = dia_da_semana(0-7)
  • /caminho/do/script.sh = comando a ser executado.

Observações:

  • Em dia_da_Semana, zero refere-se a domingo; e 6, ao sábado.
    O número 7 também refere-se ao domingo caso prefira usa-lo.
    Isso permite que você pense na semana como ela começando no domingo ou na segunda.
    No caso de dia da semana funciona também as três primeiras letras
    (em inglês) do dia da semana: SUN,MON,TUE,WED,THU,FRI,SAT
  • Pode-se usar o * (asterisco) quando não se importar com o campo em questão.
    O * representa sempre em qualquer tempo.
  • Pode-se utilizar intervalos, sendo o – (hífen) quem define isso.
    Por exemplo 1-9 significa que o comando rodará das 0h ás 9h.
    Esse exemplo seria: * 1-9 * * *
  • Pode-se utilizar uma lista de valores nesses campos, usando o carácter , (vírgula).
    Por exemplo, 1,5,10 significa que o comando rodará 1h, 5h e 10h.
    Nesse exemplo ficaria: * 1,5,10 * * *
  • Pode-se utilizar a / para fracionar um tempo em qualquer um dos campos.
    Por exemplo, com 59 */6 * * * o comando rodará de 4 em 4 horas (24/6 = 4).
  • Qualquer texto colocado após o comando que será executado, será
    considerado comentário e não será interpretado pelo cron.
    Exemplo: * * * * * /caminho/do/script.sh bom comando esse.

Comando a ser executado pode ser um script.sh, um Python.py, ou mesmo um comando direto do sistema como dd. Aqui uma sequência de exemplos práticos:

Quero rodar o script backup.sh – todos os comandos estão dentro dele – todo dia ás 5 da manhã.

0 5 * * * /caminho/do/script.sh

Agora quero executar um script Python ás 18h, aos Domingos.
Este requer o parâmetro de execução se é Python 2.7 ou 3:

0 18 * * 7 python2.7 /caminho/do/script.py

Por fim, quero limpar minha pasta /home/usuário/dados, sempre que eu sair para trabalhar ás 07:00:

0 7 * * * mv /home/usuário/dados /dev/null

Observações:

  • Sempre use caminhos completos, evite o uso de . ou ~ para encurtar os diretórios.
  • Qualquer script que não seja do BASH (Shell Script) você deve indicar quem vai executá-lo.
    Se é JavaScript, Python, Perl, etc.
  • Comandos de terminal podem ser feitos diretamente na linha de comandos do Cron, suportando concatenações, pipes e outros recursos do shell script tradicional.
    Exemplo: * * * * * ps aux | grep bash > text.txt

Exemplos práticos:

Quando? Sintaxe
Todo dia ás 3:30 PM 30 15 * * * /caminho/do/script.sh
Todo décimo dia de todo mês * * 10 * * /caminho/do/script.sh
De segunda a sexta, ao meio-dia e a meia-noite.  00 00,12 * * 1-5 /caminho/do/script.sh
Somente nos minutos 5 e 15. 5,15 * * * * /caminho/do/script.sh
Todo dia, minuto a minuto, das 03h ás 15h. * 3-15 * * * /caminho/do/script.sh
A cada 20 minutos. */20 * * * * /caminho/do/script.sh

Tira-Dúvidas:

Se definido como * * * * *, o Cron rodará o comando em questão de minuto em minuto.
Se definido como * 1 * * *, o Cron rodará o comando em questão aos 01 minuto de cada hora. (01:01, 02:01, etc)
Se definido como 0 15 * * *, o Cron rodará o comando em questão todos os dias ás 05:00 PM.

4. Interface de Usuário

O Crontab também suporta abrir programas que usam interfaces de usuário. Porém para isso você deve fazer um ajuste na sintaxe. Sempre adicione o caminho do monitor que vai exibir a janela que deseja abrir, usando o comando “export DISPLAY=:0.0 &&”.

Por exemplo, eu quero que o Firefox execute ás 18:00 de Segunda a Sexta quando chego do trabalho:

* 18 * * 1-5 export DISPLAY=:0.0 && firefox

Caso você use dois, três ou mais monitores, bastará definir quem vai exibi-lo, por exemplo :0.0, :1.0, :2.0, etc.
Quem utiliza apenas 1 monitor, o valor padrão é sempre 0.0.

5. Desativando

Caso queira desativar alguma tarefa do Cron, basta abrir o editor:

$ sudo crontab -e

E adicionar uma # no começo do comando:

# * * * * * /caminho/do/script.sh

Assim ele ficará desativado assim que você salvar e sair do editor.

6. Finalizando

Se estiver usando o editor Nano, salve com CTRL + O e feche com CTRL + X.
O Cron é um processo de sistema gerenciado pelo SystemD que roda o tempo todo. Sem necessidade de reiniciar a máquina, seus novos comandos já estarão prontos para executar assim que os parâmetros definidos forem saciados.

Lembre-se: O Cron somente entrará em ação após salvar e sair!
Se você apenas salvar mas o editor continuar aberto, o Cron não vai reconhecer os novos comandos agendados.
Isso ocorre porque a edição do cron ocorre dentro da pasta /tmp. Quando o editor é fechado, ele retorna á sua pasta original de onde o processo vai ler as novas definições e colocá-las em prática.

O Cron faz uma simples verificação 1x por minuto na tabela do arquivo gerado para checar se há algo a ser executado ou não. Caso não aja nada para executar, ele “dorme” até o próximo minuto. O processo é tão leve que consome poucos Kb’s da memória RAM.

  • Ainda tenho dúvidas, é complicado programar no Cron!

Então conheça o Crontab Guru, um site onde você põe a sintaxe e ele traduz no resultado esperado! (em Inglês)
Link: https://crontab.guru/

7. Concluindo

O Cron é com certeza uma das ferramentas mais simples e completas que temos para sistemas UNIX quando o assunto é executar programas, tarefas ou processos agendados.
Caso seu Cron não esteja funcionando, não esteja abrindo seu programa ou rodando seu script, verifique a sintaxe do comando criado. Na dúvida teste com * * * * *, assim ele executará de minuto em minuto.

Fontes:
Imagem de chamada: EduOnix
História: Wikipedia
Comandos e Explicação: EduOnix

2 comentários em “Crontab”

  1. Olá, poderia me ajudar.

    Como poderia montar uma cron para a mesma rodar todo dia 25 as 21:50 durante 6 meses a partir de abril?

    Obrigado

    Responder

Deixe um comentário