Product SiteDocumentation Site

9.7. Agendando Tarefas com cron e atd

O cron é o daemon responsável por executar comandos agendados e recorrentes (todo dia, toda semana, etc.); o atd é o que lida com comandos a serem executados uma única vez, mas em um momento específico no futuro.
Em um sistema Unix, muitas tarefas são agendadas para execução regular:
Por padrão, todos os usuários podem agendar a execução de tarefas. Cada usuário tem, assim, seu próprio crontab no qual pode gravar comandos agendados. Ele pode ser editado rodando crontab -e (seu conteúdo é armazenado no arquivo /var/spool/cron/crontabs/usuário).
O usuário root tem seu pŕoprio crontab, mas também pode usar o arquivo /etc/crontab, ou escrever arquivos crontab adicionais no diretório /etc/cron.d. Essas duas últimas soluções tem a vantagem de ser capaz de especificar a identidade do usuário a usar quando o comando for executado.
O pacote cron incluí por padrão alguns comandos que executam:
Muitos pacotes Debian contam com esse serviço: colocando scripts de manutenção nesses diretórios, eles garantem a excelente operação de seus serviços.

9.7.1. Formato do Arquivo crontab

Cada significante linha de um crontab descreve um comando agendadocom os seguintes seis (ou sete) campos:
  • o valor para o minuto (números de 0 à 59);
  • o valor para a hora (de 0 à 23);
  • o valor para o dia do mês (de 1 à 31);
  • o valor para o mês (de 1 à 12);
  • o valor para o dia da semana (a partir de 0 até 7, 1 correspondendo a Segunda, Domingo sendo representado tanto por 0 quanto por 7; ainda é possível usar as três primeiras letras do nome do dia da semana em Inglês, como Sun, Mon, etc.);
  • O nome de usuário sob cuja identidade o comando deve ser executado (no arquivo /etc/crontab e nos fragmentos localizados em /etc/cron.d/, mas não nos arquivos crontab do próprio usuário);
  • o comando a ser executado (quando as condições definidas nas primeiras cinco colunas estão satisfeitas).
Todos esses detalhes estão documentados na página de manual crontab(5).
Cada valor pode ser expresso na forma de uma lista de valores possíveis (separados por vírgulas). A sintaxe a-b descreve o intervalo de todos os valores entre a e b. A sintaxe a-b/c descreve o intervalo com um incremento de c (exemplo: 0-10/2 significa 0,2,4,6,8,10). Um asterisco * é um coringa, representando todos os valores possíveis.

Exemplo 9.2. Arquivo de exemplo crontab

#Format
#min hour day mon dow  command

# Download data every night at 7:25 pm
 25  19   *   *   *    $HOME/bin/get.pl

# 8:00 am, on weekdays (Monday through Friday)
 00  08   *   *   1-5  $HOME/bin/dosomething

# Restart the IRC proxy after each reboot
@reboot /usr/bin/dircproxy

9.7.2. Usando o Comando at

O at executa um comando em um momento específico no futuro. Ele recebe o horário e data desejados como parâmetros de linha de comando, e o comando a ser executado em sua saída padrão. O comando será executado como se estivesse sido feito no shell corrente. O at até toma o cuidado de reter o ambiente corrente, para poder reproduzir as mesmas condições quando ele executa o comando. O horário é indicado pelas seguintes convenções usuais: 16:12 ou 4:12pm representa 4:12 pm. A data pode ser especificada em vários formatos Europeus e Ocidentais, incluindo DD.MM.YY (27.07.15 assim representando 27 July 2015), YYYY-MM-DD (essa mesma data sendo expressa como 2015-07-27), MM/DD/[CC]YY (ie., 12/25/15 ou 12/25/2015 será Dezembro 25, 2015), ou simplesmente MMDD[CC]YY (logo 122515 ou 12252015 irá, do mesmo modo, representar Dezembro 25, 2015). Sem isso, o comando será executado assim que o relógio alcançar o horário indicado (no mesmo dia, ou amanhã se o horário já tiver passado no mesmo dia). Você também pode simplesmente escrever “today” ou “tomorrow”, o que é auto-explicativo.
$ at 09:00 27.07.15 <<END
> echo "Don't forget to wish a Happy Birthday to Raphaël!" \
>   | mail lolando@debian.org
> END
warning: commands will be executed using /bin/sh
job 31 at Mon Jul 27 09:00:00 2015
Uma sintaxe alternativa adia a execução por uma dada duração: at now + número período. O período pode ser minutos, horas, dias, ou semanas. O número apenas indica o número de unidades ditas que tem que ocorrer antes da execução do comando.
Para cancelar um tarefa agendada pelo cron, apenas rode crontab -e e apague a linha correspondente no arquivo crontab. Para tarefas do at, também é fácil: rode atrm número-da-tarefa. O número da tarefa é indicado pelo comando atno momento que você vez o agendamento, mas você pode obter ele novamente com o comando atq, o qual retorna a lista corrente de tarefas agendadas.