CRONTAB – o agendador de tarefas do linux

por Rodolfo Silveira

Olá pessoal, estou aqui de volta fazendo um pequeno tutorial sobre o crontab o agendador de tarefas do Linux, lembrando que o crontab existe em qualquer versão do linux.

Com o crontab é possivel especificar horários como “todos os dias ás 5 da manhã” ou “a cada meia hora”, “de dez em dez minutos”.

Para a maioria das tarefas pouco importa a hora que vai ocorrer mas sim a frequência em que ela vai ser executada, como diariamente ou semanalmente. Para isso já existe 4 diretórios especiais, que basta o administrador botar o script lá dentro, eles já serão executados na periodicidade desejada.

/etc/cron.daily diário
/etc/cron.hourly a cada hora
/etc/cron.monthly mensal
/etc/cron.weekly semanal

Mas caso você mesmo queira fazer um periodo especifico, com hora e tudo mais, basta editar o arquivo:
/etc/crontab

Então vamos lá. Escolha um editor de sua escolha, no meu caso o VIM e abra um terminal e digite:

sudo vim /etc/crontab

Notem no conteúdo:

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

Notem que já existe algumas entradas justamente dos diretórios especiais, para adicionar sua própria tarefa temos que seguir o seguinte padrão de linha:

minuto hora diadomês mês diadasemana usuário comando

Notem que para cada espaço, se avança um campo e os campos seguem o padrão existente que conhecemos, por exemplo no campo mês não pode ter 15 pois temos de 1-12 e o campo da semana usamos de 0 a 7 onde zero e 7 é domingo 1 é segunda-feira, 2 terça-feira e assim por diante.

Temos também alguns caracteres que facilitam a vida:

Caractere Exemplo Siginificado
Hífen 2-4 intervalo de 2 a 4
virgula 2,4,6,8 os números 2,4,6 e 8
barra */10 de dez em dez
asterisco * todas as opções possiveis

Vamos botar a mão na massa:

Imagine que temos uma rotina de backup que comprime o o /home e o /var/log e queremos que esta rotina aconteça diariamente as 23:35;

Se usarmos o tar por exemplo, poderíamos usar duas linhas de comando ou não, por isso recomendo que crie um script e no arquivo do CRON nós vamos apontar para o script.

Criando o script:

vim /scriptbkp.sh

O conteúdo do script, onde comprime a pasta home e a pasta log no hd externo de modo que o nome do arquivo fique com a data do dia da execução e ainda criando um arquivo de log localizado no /scriptbkplog.log para posterior análise:

#!/bin/sh
tar -cvzf /media/hdexterno/bkphome$(date +%Y_%m_%d).tar.gz /home >> /scriptbkplog.log
tar -cvzf /media/hdexterno/bkplog$(date +%Y_%m_%d).tar.gz /var/log >> /scriptbkplog.log

Salve e saia.

Vamos dar permissão de execução também:

sudo chmod 755 /scriptbkp.sh

Agora vamos lá no crontab:

sudo vim /etc/crontab

Adicione a seguinte linha:

35 23 * * * root sh /scriptbkp.sh

Salve e saia. Pronto, todos os dias da semana, todos os meses, todos os dias do mês, na hora 23 e minuto 35 ele vai executar o script e enviar o backup para o hd externo do exemplo.

Mas e se quisermos a atividade de segunda e sabado as 09:27. A linha ficará assim:

27 09 * * 1,6 root sh /scriptbkp.sh

Se quisermos toda hora, de 08 as 18 de segunda a sexta:

00 8-18 * * 1-5 root sh /scriptbkp.sh

Se quisermos fazer mensalmente independente da hora, feche o crontab e mova o arquivo para a pasta especial, com o seguinte comando:

sudo mv /scriptbkp.sh /etc/cron.monthly

FIM! Se tiverem dúvida podem entrar em contato valeu!

Rodolfo Silveira
@rodolfo_tec
e-mail: [email protected]