Agendando tarefas com o cron

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


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


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


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.

  • 13753 Usuários acharam útil
Esta resposta lhe foi útil?

Related Articles

Instalando WatchMySQL – Monitore o uso do MySQL

Este é um plugin para o WHM e é usado para matar processos do MySQL. Por exemplo, você tem um...

Manual Básico do cPanel

Adicionar/Remover contas POP3Você mesmo poderá adicionar, editar ou remover contas POP3/IMAP, de...

Removendo o aviso de Phishing do seu site

Quando a detecção de phishing e malware está ativada, as seguintes mensagens podem ser exibidas...

Aprenda a copiar o nome de todos os arquivos de uma pasta de uma só vez

Quem já precisou, independente do motivo, copiar vários nomes de arquivos de uma só vez, sabe o...

Como instalar o cPanel em um servidor Linux

Antes demais, para instalar o cPanel em um servidor vai precisar de: Licença do cPanel, Servidor...