Cola rápida para criar Cron Jobs

As instruções abaixo são baseados no linux CentOS.

Motivação

A motivação para escrever esse post, foi para criar um Cron para ser executado de hora em hora no Heroku, pois o Add-on Cron do Heroku só é gratuito para uma execução por dia, eu precisava executar de hora em hora.

Para isso criei um Cron que invoca a minha url no Heroku de hora em hora.

#! /bin/sh
wget pablocantero.com/service

Como fazer de graça?

Existem serviços gratuitos na internet para isso, como o www.mywebcron.com, que podem ser uma opção interessante para invocar URLs de tempos em tempos.

Crontab

Para criar um Cron você pode utilizar o programa Crontab.

crontab usage: crontab [-u user] file
 crontab [-u user] [ -e | -l | -r ]
 (default operation is replace, per 1003.2)
 -e  (edit user's crontab)
 -l  (list user's crontab)
 -r  (delete user's crontab)
 -i  (prompt before deleting user's crontab)
 -s  (selinux context)

Editando com o Vi

No CentOS por padrão ao usar o crontab -e, abrirá o Nano, que não estou muito acostumado. Portanto prefiro editar com o Vi, para isso basta abrir diretamente o arquivo Cron do usuário.

O arquivo Cron do usuário fica no caminho /var/spool/cron/, no meu caso o root.

vi /var/spool/cron/root

**Diretórios auxiliares

Qualquer script que esteja nos diretórios abaixo será executado de hora em hora, diariamente, semanalmente ou mensalmente, de acordo com o diretório.

Essa configuração fica no arquivo /etc/crontab.

SHELL=/bin/bash
PATH=/sbin:/bin:/usr/sbin:/usr/bin
MAILTO=root
HOME=/

# run-parts
21 * * * * root run-parts /etc/cron.hourly
35 1 * * * root run-parts /etc/cron.daily
58 5 * * 0 root run-parts /etc/cron.weekly
23 2 18 * * root run-parts /etc/cron.monthly

Parâmetros para criar um Cron

A configuração de um Cron é feita com o seguinte padrão:

[minutos] [horas] [dias do mês] [mês] [dias da semana] [usuário] [comando]

Sendo:

Minuto: 0-59 Hora: 0-23 Dia do mês: 1-31 Mês: 1-12 Dia da semana: 0-6, onde domingo = 0, segunda = 1 etc

Exemplo de Cron

Para executar um script que recupera o resultado da Mega Sena no site Caixa. Precisamos executar um script Web scraping, das 18h até 22h, toda quarta-feira e sábado. Que é quando ocorre os sorteios da Mega Sena.

Para isso teremos que adicionar a seguinte configuração.

vi /var/spool/cron/root
# No final do arquivo adicionar
59 17,18,19,20,21,22 * * 3,6 /meus_scripts/megasena_web_scraping.sh

O megasenawebscraping.sh será executado 17:59, 18:59, 19:59, 20:59, 21:59 e 22:50, toda quarta-feira = 3 e sábado = 6

Seguindo o comentário do @nadilsons, também possível gerenciar os intervalos com 17-22, simplificando o Cron acima.

59 17-22 * * 3,6 /meus_scripts/megasena_web_scraping.sh

Lembre-se que é importante definir o parâmetro minuto, pois se deixar com *, o script será executado de minuto em minuto.

Executando em intervalo de minutos

Se somente o parâmetro de minuto estiver configurado, isso não fará que o script seja executado a cada minuto, na verdade ele será executado sempre no minuto configurado no intervalo de hora em hora.

1 * * * * /meus_scripts/script.sh

Portanto o script acima será executado sempre no minuto 1 de hora em hora. Para fazer com que esse script seja executado a cada um minuto, o intervalo de minutos precisa ser configurado da seguintes formas:

0-59 * * * * /meus_scripts/script.sh

Ou

*/1 * * * * /meus_scripts/script.sh

Onde */1, indica o intervalo de 1 minuto.