O agendamento de tarefas é um recurso essencial em servidores. No
Linux, o daemon responsável pela tarefa é o cron. Ele é o responsável
por diversas funções executadas automaticamente na maioria das
distribuições, tais como o rotacionamento dos logs e pode ser programado
para executar operações diversas, tais como scripts de backup.
O arquivo principal de configuração é o “/etc/crontab”
e o script responsável pelo serviço é o “/etc/init.d/cron” (ou
“/etc/init.d/crond” no Fedora e no CentOS). A configuração do cron pode
parecer indigesta à primeira vista, mas na verdade ela é bastante lógica
e, dependendo do ponto de vista, até mesmo simples.
Você pode criar um agendamento simples adicionando a linha abaixo no final do arquivo:
* * * * * root date >> /tmp/testedata
Ela faz com que o sistema execute o comando “date >>
/tmp/testedata” uma vez a cada minuto. O comando “date” mostra o horário
atual do sistema e as duas setas direcionam a saída do comando para o
arquivo especificado.
Depois de salvar o arquivo, você precisa apenas esperar um minuto ou
dois e verificar o conteúdo do arquivo para checar se o agendamento está
funcionando. Ele conterá várias linhas com a saída do comando, como em:
Qui Jun 19 04:36:38 BRT 2008
Qui Jun 19 04:36:39 BRT 2008
Qui Jun 19 04:36:39 BRT 2008
O cron checa o conteúdo do arquivo uma vez a cada minuto, de forma
que não é necessário reiniciar o serviço para que a alteração entre em
vigor. Para desativar o agendamento, basta remover ou comentar a linha.
Os cinco campos separados por espaço no início da linha permitem
definir o horário ou a periodicidade em que uma determinada tarefa será
executada. O primeiro campo especifica os minutos, o segundo especifica
as horas, o terceiro especifica o dia, o quarto o mês e o quinto
especifica o dia da semana. A princípio essa designação parece muito
confusa, mas na verdade ela é bastante prática.
Para que o comando fosse executado todos os dias às 6:20 da manhã, usaríamos:
20 06 * * * root date >> /tmp/testedata
Os dois campos especificam a hora, como você pode ver. Os outros três
(dia, mês e dia da semana) permanecem com o asterisco, o que faz com
que o comando seja executado todos os dias. Se a idéia fosse fazer com
que ele fosse executado nessa mesma hora, mas apenas aos domingos
(imagine o caso de um script de backup que precisasse desativar
temporariamente o banco de dados, deixando o servidor fora do ar, por
exemplo), você usaria:
20 06 * * 0 root /usr/local/bin/script-de-backup
Veja que agora usamos o número 0 no último campo, que indica o dia da
semana. Na sintaxe do cron, os dias da semana são numerados de 0 a 6,
onde o “0” representa o domingo e o “6” o sábado.
É possível também especificar mais de um valor em um mesmo campo,
fazendo com que o script seja executado duas vezes por dia, ou duas
vezes por semana, sem precisar incluir duas linhas diferentes. Se deseja
que um script seja executado tanto aos domingos quanto às
quartas-feiras, sempre às 4:00 da manhã, você usaria:
00 04 * * 0,3 root /usr/local/bin/script-de-backup
A vírgula no campo do dia da semana permite especificar mais de um
valor, ela é interpretada pelo cron como um “e”, de forma que “0,3” é
lido como “aos domingos e às quartas feiras”.
É possível também usar a “/” para indicar um período. Para fazer com que o script seja executado a cada 5 minutos, você usaria:
*/5 * * * * root /usr/local/bin/verificar-servidor
O mesmo pode ser feito para os demais campos. Para que o script fosse
executado a cada 3 horas (1:15, 4:15, 7:15, etc.), por exemplo, você
usaria:
15 */3 * * * root /usr/local/bin/verificar-servidor
Continuando, temos os campos com o dia e o mês. Para executar um
script às 6:20 da manhã, no primeiro dia de cada mês, você usaria:
00 06 1 * * root /usr/local/bin/gerar-folha-de-pagamento
Para executar apenas no dia primeiro de janeiro, uma vez por ano, usaria:
00 06 1 * * root /usr/local/bin/feliz-ano-novo
O cron executa a tarefa apenas se todas as condições especificados
nos campos sejam satisfeitas. Isso permite especificar condições
bastante específicas. Para executar um comando às 00:15 toda vez que uma
sexta feira cair no dia 13 (imagine que você seja supersticioso e
queira fazer um backup extra, por exemplo :), você usaria:
15 00 13 * 5 root /usr/local/bin/backup-extra
Naturalmente, você pode também fazer com que os scripts sejam
executados usando outros logins de usuário em vez do root, o que é o
ideal do ponto de vista da segurança. Para isso, basta substituir o
“root” pelo login desejado. Com isso, o script é executado dentro das
permissões do usuário, o que limita qualquer possível dano ou brecha de
segurança que possa ser aberta pelo script.
Em quase todas as distribuições atuais, o arquivo “/etc/crontab”
vem pré-configurado para que o sistema execute os scripts incluídos nas
pastas “/etc/cron.hourly”, “/etc/cron.daily”, “/etc/cron.weekly” e
“/etc/cron.monthly”, executados, respectivamente, uma vez a cada hora,
dia, semana e mês:
01 * * * * root run-parts /etc/cron.hourly
02 4 * * * root run-parts /etc/cron.daily
22 4 * * 0 root run-parts /etc/cron.weekly
42 4 1 * * root run-parts /etc/cron.monthly
02 4 * * * root run-parts /etc/cron.daily
22 4 * * 0 root run-parts /etc/cron.weekly
42 4 1 * * root run-parts /etc/cron.monthly
Esta configuração facilita o agendamento de tarefas, já que para
fazer com que um script seja executado todos os dias, por exemplo, você
precisa apenas colocá-lo dentro da pasta “/etc/cron.daily”. Olhando o
conteúdo da pasta, você notará a presença de diversos scripts de
manutenção do sistema, como o logrotate, encarregado de rotacionar e
compactar os arquivos de log, evitando que eles cresçam indefinidamente.
Os scripts incluídos na programação do cron são arquivos de texto
simples, contendo os comandos que você deseja que sejam executados. Aqui
temos um exemplo de script simples de backup, que usa o rsync para
salvar uma cópia do conteúdo da partição “/var/www” na pasta
“/mnt/sdb1″, que corresponderia a um HD separado, salvando a saída do
comando, em um arquivo de texto, que você pode examinar posteriormente
em busca de erros:
#! /bin/sh
/usr/bin/rsync -av –delete /var/www/ /mnt/sdb1 >> /var/log/backup-www.log
/usr/bin/rsync -av –delete /var/www/ /mnt/sdb1 >> /var/log/backup-www.log
Para que o script fosse executado todos os dias, você precisaria
apenas copiá-lo para a pasta “/etc/cron.daily” e marcar a permissão de
execução (chmod +x). Outra opção seria simplesmente adicionar uma nova
linha no arquivo “/etc/crontab“, especificando a hora em que você deseja que ele seja executado.
Nenhum comentário:
Postar um comentário