terça-feira, 21 de julho de 2009

Agendar tarefas com o Cron

Cron é um agendador de tarefas para computadores com sistemas operacionais tipo Unix. O nome Cron é uma abreviação para cronógrafo.

O Cron possibilita aos usuários agendar tarefas, que podem ser comandos ou scripts, para serem executadas em um determinado horário ou dia. É bastante usado para automatizar a manutenção do sistema, como realização de backups, limpeza de arquivos, checagem preventiva, atualizações etc.

Trata-se de um monitor (daemon) que fica em execução permanente em segundo plano e verifica minuto a minuto se existe alguma tarefa agendada para ser executada. Se existir, o Cron executa a tarefa. Uma tarefa é executada quando a hora e data especificados no crontab coincidem-se com a hora e data local.

O Cron é guiado por uma tabela existente em /etc/crontab. Um crontab é um simples arquivo texto que contém uma lista de comandos que serão executados no tempo especificado. Possui também um programa usado para instalar, desinstalar ou listar as tabelas usadas pelo Cron.

Cada linha em um arquivo crontab representa uma tarefa e segue um formato particular com uma série de seis campos separados por espaços e ou tabulações. Cada campo pode ter um único valor ou uma série de valores. E somente o sexto campo pode conter espaços em seu interior.

Este formato é simples de entender. Cada linha é uma coleção de seis campos que são:

1) Minuto (0-59)
2) Hora (0-23)
3) Dia do mês (1-31)
4) Mês (1-12)
5) Dia da semana (0-7) Obs: 0 e 7 determina o Domingo
6) Comando à ser executado

Exemplo:

35 14 3 11 * tar czvf backup.tgz /home

Cada um dos cinco primeiros campos contém números. Os campos mês e dia da semana também podem conter as iniciais das palavras em inglês, como sun, Mon, jul, Feb.

Além dos números, cada um dos cinco primeiros campos podem conter caracteres para satisfazer outras situações:

a       Somente para a
a,b,c Para a, b e c
a-b De a até b
* Em todos os valores possíveis do campo
a-d/x De a até d em espaços de x. Ex.: 1-9/2 é o mesmo que 1,3,5,7,9
*/15 * * * * determina a cada 15 minutos
0 */23 * * * determina a cada 23 horas

Também é possível no lugar dos cinco primeiros campos colocar uma das oito strings abaixo, todas seguidas por @, cada uma especificando uma situação especial. Os cinco campos serão substituídos pelas strings abaixo:

@reboot      Executa uma vez na inicialização da máquina
@yearly Executa uma vez a cada ano, equivalente a 0 0 1 1 *
@annually O mesmo que @yearly
@monthly Executa uma vez a cada mês, equivalente a 0 0 1 * *
@weekly Executa uma vez a cada semana, equivalente a 0 0 * * 0
@daily Executa uma vez a cada dia, equivalente a 0 0 * * *
@midnight O mesmo que @daily
@hourly Executa uma vez a cada hora, equivalente a 0 * * * *

Para manipular o arquivo crontab usa-se seu executável, de mesmo nome, seguido do parâmetro de acordo com a ação. Basicamente temos estes três parâmetros:

-l    Lista os agendamentos existentes no crontab
-e Edita o crontab com o editor padrão, normalmente o vi
-r Remove todos os agendamentos existentes no crontab

Estando a linha corretamente inserida no crontab, o Cron irá executar o comando quando a hora e data especificada chegar. Para cada usuário que cria um agendamento o crontab cria um arquivo no diretório /var/spool/cron/ contendo a linha do crontab deste usuário. O administrador do sistema pode controlar qual usuário tem ou não permissão para criar um agendamento adicionando o username em um destes arquivos, /etc/cron.allow e /etc/cron.deny.

É uma boa prática redirecionar a saída padrão e o erro padrão de cada tarefa agendada para um arquivo, para isto adicione ao final de cada linha, após o comando, algo como exemplificado na linha abaixo:

15 6 * * * comando > /home/usuario/log.txt 2>&1

O crontab possui também quatro agendamentos pré-definidos, invocados pelo /etc/crontab. São subdiretórios dentro do diretório /etc que podem conter arquivos de script, assim, ocorrendo o determinado período todos os scripts serão executados. Dentro do /etc temos:

cron.hourly:    Será executado de hora em hora
cron.daily: Será executado de dia em dia
cron.weekly: Será executado de semana em semana
cron.montly: Será executado de mês em mês

Basta editar um script, lembrando de tornar seu arquivo executável, e movê-lo para dentro de um destes subdiretórios. Os arquivos serão executados em ordem alfabética.

Uma outra possibilidade é o diretório /etc/cron.d/. O Cron trata os arquivos em /etc/cron.d da mesma forma que o arquivo crontab, seguindo o formato particular com campos. Por exemplo, basta criar um arquivo texto contendo uma única linha com a mesma sintaxe do crontab. O propósito deste diretório é permitir um tratamento mais fino aos agendamentos do que os diretórios /etc/cron.{hourly,daily,weekly,monthly}. Do mesmo modo que qualquer outro arquivo crontab, os arquivos dentro do diretório /etc/cron.d são monitorados por mudanças.

Trabalhando em conjunto com o Cron existe outro daemon chamado Anacron que funciona de forma semelhante ao Cron. Sua diferença é que o Anacron executa uma tarefa que era para ter sido executada em um horário em que a máquina se encontrava desligada. Então quando a máquina voltar a estar ligada ele checa o anacrontab e executa as tarefas pendentes. Este programa é útil em um máquina que não fica o tempo todo ligada.

Para cada tarefa o Anacron checa se já foi executada nos últimos n dias, sendo n o período especificado para esta tarefa. Se não, o Anacron executa o comando após esperar o número de minutos também especificado como parâmetro. Somente a data é checada para a verificação do agendamento pendente, hora e minuto não são usados.

A distribuição Fedora utiliza o Cronie. Ele é uma ramificação do original Vixie-Cron, possuindo um aprimoramento para a segurança e configuração, como a habilidade de usar PAM e o SELinux.

Nenhum comentário:

Postar um comentário