Home / Dicas e Tutoriais / Agendador de Tarefas Cron no Linux

Agendador de Tarefas Cron no Linux

Introdução

O Cron é um programa que roda em sistemas Unix e GNU/Linux, e este programa pode executar comandos e programas de acordo com uma agenda determinada. Ou seja, o Cron é um agendador de tarefas do sistema operacional.

Esta agenda pode ser configurada dentro do arquivo de tabela “/etc/crontab”, e também pode estar em um diretório que cria um crontab para cada usuário do sistema (geralmente em /var/spool/cron/). Mas a maneira mais simples de criar uma entrada de agendamento no cron, é através do comando “crontab -e”.

Usando o Cron Pela Primeira Vez

A primeira vez que você rodar este comando, ele irá perguntar-lhe qual editor de texto prefere usar para fazê-lo, e uma vez escolhida, ele usará esse editor nas próximas vezes.
Como pode perceber na imagem abaixo, ele recomenda usar o “nano”, pois é o “easiest”, ou seja “o mais fácil” de usar.

cron1

Funções do Crontab

Exemplos de Agendamentos:

2 – Agendas Simples com Script em Shell Em Pastas do Cron.

Se você tiver uma tarefa que precisa ser executada apenas uma vez por dia, ou por semana, não importando tanto com o horário de execução, você poderá criar um script em shell, e ao invés de editar o crontab (inserindo uma entrada que aponta para a localização do script, com os parâmetros de agendamento), basta colocar seu script dentro de diretórios específicos do cron e eles serão executados conforme a rotina de cada diretório, que são:

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

2 – Agendas Detalhadas

Editando o arquivo crontab, é possível inserir uma entrada definindo horários de execução de um script ou comando, como por exemplo, “todos os dias às 5 da manhã” ou “a cada meia hora”, “de dez em dez minutos”.

Então, o mais comum é fazer o agendamento dentro de um horário específico, e como eu disse, precisará editar o arquivo /etc/crontab.

Para editarmos o crontab você poderá fazê-lo de 2 formas.
1 – Ediando o arquivo /etc/crontab, usando seu editor de texto. Exemplo: sudo nano /etc/crontab
2 – Usando o comando padrão “crontab -e”. (Este é mais recomendável).

Poderá usar outros comandos para gerenciar o cron também:

crontab -l (para listar),
crontab -d (para remover).

Visualizando o Cron de Seu Sistema

Com o comando cat /etc/crontab, podemos observar o conteúdo do arquivo.
—————————————————————————————————————————-
# /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 )
—————————————————————————————————————————-

Com o comando crontab -l, podemos listar o crontab de seu usuário.
Obs. Repare que não há nenhum agendamento ainda, e que todas as linhas estão comentadas (#), mas ele dá um exemplo na antepenúltima linha de como seria um agendamento para as 5 da manhã diariamente rodar o comando de compactação da sua pasta home e salvá-la em /var/backups.

—————————————————————————————————————————-

# Edit this file to introduce tasks to be run by cron.
#
# Each task to run has to be defined through a single line
# indicating with different fields when the task will be run
# and what command to run for the task
#
# To define the time you can provide concrete values for
# minute (m), hour (h), day of month (dom), month (mon),
# and day of week (dow) or use ‘*’ in these fields (for ‘any’).#
# Notice that tasks will be started based on the cron’s system
# daemon’s notion of time and timezones.
#
# Output of the crontab jobs (including errors) is sent through
# email to the user the crontab file belongs to (unless redirected).
#
# For example, you can run a backup of all your user accounts
# at 5 a.m every week with:
# 0 5 * * 1 tar -zcf /var/backups/home.tgz /home/
#
# For more information see the manual pages of crontab(5) and cron(8)
#
# m h dom mon dow command

—————————————————————————————————————————-

Estrutura do Cron

Como podemos perceber acima, já existem algumas entradas do sistema. E a ordem dos parâmetros se dá da seguinte forma:

minuto, hora, dia do mês, mês, dia da semana, usuário, e comando. 

A cada espaço, se avança um campo e os campos seguem este padrão descrito acima.

Observe os limites de cada campo, por exemplo, no campo mês não pode ter 15, pois temos de 1-12 meses no ano, 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. Se usarmos no campo semana, por exemplo 1-5, ele rodará o comando de segunda a sexta-feira.

CRONTAB

Caracteres que facilitam a vida:

Caractere     Exemplo     Significado
Hífen             2-4               intervalo de 2 a 4
Virgula         2,4,6,8           os números 2,4,6 e 8 (como dias da semana específicos apenas)
Barra            */10              de dez em dez
Asterisco       *                  todas as opções possíveis

No lugar dos números da agenda podemos usar essas opções também:

@reboot
@daily
@monthly

Exemplos serão dados mais abaixo.

NA PRÁTICA

3 PASSOS PARA CRIAR UM AGENDAMENTO PARA EXECUÇÃO DE UM SCRIPT:

Vamos criar uma rotina de backup que comprime a pasta /home e o /var/log e queremos que esta rotina aconteça diariamente às 8:45, entre outros agendamentos.
Para fazermos isso, ao invés de criarmos duas entradas no crontab, sendo uma para compactar e outra para copiar os arquivos para o local desejado, será mais fácil criar um simples script em shell e criar uma entrada apenas no crontab que rodará esse script.

1 – Criando um Script de Backup com Timestamp.

papiro

Vamos criar um script que deverá:

1 – Comprimir as pastas “/home” e “/var/log” usando “tar” (empacotar) e “gz” (comprimir);
2 – Copiá-las para a partição de Dados;
3 – Com Time Stamp – de modo que o nome do arquivo fique com a data do dia da execução;
4 – E ainda criando um arquivo de log localizado no /scriptbkplog.log para posterior análise.

Crie com o gedit ou no terminal com seu editor de texto favorito, um script chamado “scriptbkp.sh”. Pode-se fazer isso com o comando: “sudo gedit /scriptbkp.sh”, ou se preferir usar o “vi” ou o “nano” para fazer tudo no terminal: “sudo nano /scriptbkp.sh”

Vamos inserir este conteúdo abaixo dentro do arquivo criado:

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

Salve e feche.

2 – Permissão de execução

Agora, vamos dar permissão de execução também:

sudo chmod 755 /scriptbkp.sh

3 – Agendando no Cron – 5 Exemplos

Agora vamos editar o crontab, criando uma agenda que rode este script diariamente, só que as 8:45 da manhã.
Edite o crontab com seu editor de texto favorito (“vi”, “vim”, “nano” ou com o gedit, caso esteja usando ambiente gráfico).

sudo gedit /etc/crontab
ou
sudo crontab -e

Exemplo 1:

Para que todos os dias da semana, todos os meses, todos os dias do mês, na hora 8 e minuto 45 ele execute o script e envie o backup para a partição /media/Dados.
Adicione a seguinte linha:

45 8 * * * /scriptbkp.sh

Exemplo 2:

Se quisermos a execução apenas na segunda-feira e depois só no sábado as 09:30. A linha ficará assim:
(repare a vírgula entre o 1 e o 6 – segunda e sábado)

30 09 * * 1,6 /scriptbkp.sh

Exemplo 3:

Se quisermos toda hora, das 8:00 as 18:00 de segunda a sexta:

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

Exemplo 4:

Se quisermos fazer com que o script rode de hora em hora (sem agenda de dias específicos), diariamente, semanalmente ou mensalmente, ao invés de inserirmos uma entrada no crontab, basta copiar ou mover o script para a pasta especial do cron desejada.

sudo cp /scriptbkp.sh /etc/cron.monthly
sudo cp /scriptbkp.sh /etc/cron.hourly
sudo cp /scriptbkp.sh /etc/cron.weekly
sudo cp /scriptbkp.sh /etc/cron.diary

Ou Usarmos o caractere “@” para rodar após todo o reboot, diariamente ou mensalmente:

@reboot /scriptbkp.sh
@daily /scriptbkp.sh
@monthly /scriptbkp.sh

Exemplo 5:

Tarefa simples, sem o uso de script

Neste exemplo vamos rodar um comando que copie todo o conteúdo de minha pasta pessoal para minha partição de Dados ou um HD externo de segunda a sexta-feira as 8:30 da manhã.

Basta adicionar uma linha como esta, claro, que com o nome de sua pasta pessoal e de seu Hd externo ou partição de dados, ou diretório de rede que desejar.

30 8 * * 1-5 root cp -r /home/cleuber /media/hd-externo

Visualizando o log de tarefas do Cron

Para ver se as tarefas rodaram adequadamente através da análise de logs, dê uma olhada neste artigo:
http://cleuber.com.br/index.php/2016/01/19/gerenciando-os-logs-do-cron

Bom, é isso aí pessoal!

Mais alguma dica? Deixe aí sua opinião.

Abraços,

Cleuber

About Cleuber

Cleuber Silva Hashimoto. Administrador

2 comments

Leave a Reply

x

Check Also

Elementary OS 6 Odin Lançado – Confira as Novidades

Desenvolver um sistema operacional não é ...