Product SiteDocumentation Site

9.7. Agendando tarefas com cron e atd

cron é o daemon responsável por executar comandos agendados e recorrentes (todo dia, toda hora, toda semana, etc.); atd 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(as) os(as) usuários(as) podem agendar a execução de tarefas. Cada usuário tem, assim, seu próprio crontab no qual pode gravar comandos agendados. 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 têm a vantagem de ser capaz de especificar a identidade do(a) usuário(a) a usar quando o comando for executado.
O pacote cron inclui por padrão alguns comandos que executam:
Muitos pacotes Debian contam com esse serviço: ao colocar scripts de manutenção nesses diretórios, garantem a excelente operação de seus serviços.

9.7.1. Formato do arquivo crontab

Cada linha significativa de uma entrada no crontab descreve um comando agendado com os seguintes seis (ou sete) campos:
  • o valor para o minuto (de 0 a 59);
  • o valor para a hora (de 0 a 23);
  • o valor para o dia do mês (de 1 a 31);
  • o valor para o mês (de 1 a 12);
  • o valor para o dia da semana (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(a) 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(a) próprio(a) usuário(a));
  • o comando a ser executado (quando as condições definidas nas primeiras cinco colunas estiverem satisfeitas).
Todos esses detalhes estão documentados na página de manual crontab(5).
Cada valor também 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. Exemplo de arquivo crontab de usuário(a)

#Formato
#min hora dia mês dia-da-semana  comando

# Baixa dados toda noite às 19:25
 25  19   *   *   *    $HOME/bin/get.pl

# 8:00 da manhã, nos dias de semana (Segunda a Sexta)
 00  08   *   *   1-5  $HOME/bin/dosomething

# a cada duas horas
 *  */2   *   *   *    $HOME/bin/dosomethingelse

# Reiniciar o proxy IRC após cada reinicio
@reboot /usr/bin/dircproxy

9.7.2. Usando o comando at

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 tivesse sido digitado no shell corrente. at até toma o cuidado de reter o ambiente corrente, para poder reproduzir as mesmas condições quando executa o comando. O horário é indicado pelas seguintes convenções usuais: 16:12 ou 4:12pm representa 4:12 da tarde. A data pode ser especificada em vários formatos europeus e ocidentais, incluindo DD.MM.YY (27.07.22 assim representando 27 de julho de 2022), YYYY-MM-DD (essa mesma data sendo expressa como 2022-07-27), MM/DD/[CC]YY (isto é, 12/25/22 ou 12/25/2022 será 25 de dezembro de 2022), ou simplesmente MMDD[CC]YY (logo 122522 ou 12252022 irá, do mesmo modo, representar 25 de Dezembro de 2022). 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” (hoje) ou “tomorrow” (amanhã), o que é auto-explicativo.
$ at 09:00 27.07.22 <<END
> echo "Não se esqueça de desejar feliz aniversário para Raphaël!" \
>   | mail lolando@debian.org
> END
Aviso: comandos serão executados utilizando/bin/sh
job 1 at Wed Jul 27 09:00:00 2022
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 em que você vez o agendamento, mas você pode obter ele novamente com o comando atq, o qual retorna a lista corrente de tarefas agendadas.