Comando at: Agendamento de Tarefas Unicas no Linux

Comando at: Agendamento de Tarefas Unicas no Linux

O Que Voce Vai Aprender

  • Como agendar uma tarefa unica com at
  • Como listar e cancelar tarefas pendentes com atq / atrm
  • Quando usar at ao inves de cron

Resumo Rapido

  • Executar uma vez em um horario definido --> at
  • Executar repetidamente em um agendamento --> cron / timer do systemd
  • Confirme que o atd esta em execucao primeiro; atq e atrm sao tudo que voce precisa para gerenciar tarefas

Premissas (ambiente alvo)

  • SO: Ubuntu / Debian (sistemas baseados em RHEL funcionam da mesma forma)
  • O pacote at e o daemon atd sao necessarios (frequentemente nao instalados por padrao)

O Que e o Comando at?

Conclusao: at executa um comando uma vez em um horario especificado. Ele e feito para tarefas unicas e nao recorrentes.

Enquanto o cron lida com tarefas recorrentes ("todo dia", "toda semana"), o at lida com execucao agendada unica -- "uma vez hoje a noite as 23h" ou "uma vez, daqui a 5 minutos".

Uma tarefa agendada e monitorada pelo atd (o daemon do at), que a executa quando o horario chega. A tarefa sobrevive ao logout ou ao fechamento do shell.

Uma ferramenta relacionada e o batch. Em vez de um horario, o batch executa uma tarefa quando a carga do sistema cai abaixo de um limite. Use-o para empurrar trabalho pesado para fora dos periodos de pico.

O at Esta Pronto para Usar? Verificando e Instalando o atd

Conclusao: Ter o binario do at nao e suficiente -- tarefas so sao executadas se o atd estiver ativo. Verifique o daemon primeiro.

Em muitos sistemas Ubuntu / Debian o at nao vem instalado por padrao. Instale e verifique:

# Debian / Ubuntu
$ sudo apt install at

# RHEL / CentOS / Rocky
$ sudo dnf install at

Verifique o status do daemon:

$ systemctl status atd
● atd.service - Deferred execution scheduler
     Loaded: loaded (/lib/systemd/system/atd.service; enabled; preset: enabled)
     Active: active (running) since ...

Se nao estiver active (running), inicie e habilite:

$ sudo systemctl enable --now atd

A causa mais comum de "minha tarefa nunca executou" e um atd parado. Voce pode registrar uma tarefa normalmente, mas se o atd estiver parado nada acontece quando o horario chega.

Como Agendar uma Tarefa?

Conclusao: Execute at HORARIO, digite comandos no prompt e finalize com Ctrl+D. Para scripts, passe-os com -f.

Entrada interativa

$ at now + 5 minutes
warning: commands will be executed using /bin/sh
at> echo "hello" >> /tmp/at-test.log
at> <EOT>
job 3 at Fri Jun  5 23:10:00 2026

Digite comandos no prompt at>, depois pressione Ctrl+D (mostrado como <EOT>). Em caso de sucesso, voce recebe um numero de tarefa e o horario agendado.

A partir de um arquivo (recomendado)

Entrada interativa e propensa a erros. Na pratica, passe um script com -f:

$ at -f /path/to/job.sh 23:00
# Passar um comando via pipe
$ echo 'tar czf /backup/data.tgz /var/www' | at 02:00 tomorrow

O diretorio de trabalho, variaveis de ambiente e umask sao salvos no momento do envio e restaurados na execucao. Ainda assim, evite depender do PATH -- escreva comandos com caminhos absolutos.

Como Escrever a Especificacao de Horario?

Conclusao: Voce pode usar HH:MM, now + N unidades, midnight / noon / teatime, e datas explicitas. Especificacoes relativas sao as mais praticas.

O at aceita expressoes de tempo flexiveis. Padroes comuns:

Formato Significado
at 23:00 23h hoje (amanha se ja passou)
at 10:00 AM 10 da manha
at now + 30 minutes 30 minutos a partir de agora
at now + 2 hours 2 horas a partir de agora
at midnight 00:00 desta noite
at noon 12:00
at teatime 16:00 (hora do cha)
at 02:00 tomorrow 2h da manha de amanha
at 10:00 next week Mesmo dia da semana na proxima semana, 10:00
at 2026-12-31 23:59 Data e hora explicitas
# Exemplo: rotacionar logs as 3h de amanha
$ echo '/usr/local/bin/rotate-logs.sh' | at 3:00 tomorrow

Se voce informar um horario que ja passou hoje, o at interpreta como o mesmo horario amanha. Uma tarefa que voce esperava executar "imediatamente" pode escorregar para o dia seguinte. Para mirar confiavelmente no futuro proximo, use now + N minutes.

Como Listar e Cancelar Tarefas?

Conclusao: Liste com atq, remova com atrm JOBID e inspecione com at -c JOBID. Esses tres cobrem o gerenciamento de tarefas.

Listar tarefas pendentes (atq)

$ atq
3	Fri Jun  5 23:10:00 2026 a user
5	Sat Jun  6 02:00:00 2026 a user

As colunas sao numero da tarefa / horario agendado / fila / proprietario. a e a fila normal; b e a fila do batch.

Remover uma tarefa (atrm)

$ atrm 3

Exclua pelo numero. Voce pode remover varias de uma vez:

$ atrm 3 5

Inspecionar uma tarefa (at -c)

Para ver exatamente o que esta agendado antes da execucao, use -c:

$ at -c 5

Ele imprime o bloco de restauracao de ambiente salvo e o corpo real do comando.

atq e o mesmo que at -l, e atrm e o mesmo que at -d. Em scripts, os nomes explicitos atq / atrm sao mais claros de ler.

Para Onde Vai a Saida?

Conclusao: O stdout e stderr de uma tarefa sao enviados ao usuario por email local. Sem um servidor de email, a saida e perdida -- redirecione para um arquivo.

A saida de uma tarefa at nao vai para seu terminal; ela vai para o email local do usuario que a submeteu. Leia com mail ou em /var/mail/<user>.

Em um servidor sem MTA (entrega de email), a saida e simplesmente descartada. Para manter resultados de forma confiavel, redirecione dentro da tarefa:

$ echo '/usr/local/bin/backup.sh > /var/log/backup.log 2>&1' | at 02:00

Se uma tarefa "executou mas nao deixou resultado", provavelmente foi para o email, ou voce esqueceu de definir um destino de saida. Sempre redirecione tarefas de producao para um arquivo de log com > ... 2>&1.

Quando Usar at ao Inves de cron?

Conclusao: Use cron / timer do systemd para trabalho recorrente e at para trabalho unico. "Apenas esta noite" ou "uma vez apos a manutencao" se encaixa melhor no at.

Caso de uso Recomendado
Recorrente (diario, semanal) cron / timer systemd
Uma vez em um horario definido at
Executar quando a carga cair batch
Tarefas recorrentes confiaveis (logs, deps) timer systemd

Escrever uma tarefa unica no cron e esquecer de remove-la -- fazendo-a disparar novamente no dia seguinte -- e um erro comum. Quando voce sabe que e de uso unico, o at nao precisa de limpeza e e mais seguro.

Para tarefas recorrentes em geral, veja Basico do cron e Timer do systemd vs cron.

Controle de Acesso e Ressalvas

Conclusao: O acesso ao at e controlado por /etc/at.allow e /etc/at.deny. Se at.allow existir, ele tem prioridade.

  • Se /etc/at.allow existir: apenas usuarios listados podem usar o at
  • Se at.allow estiver ausente mas /etc/at.deny existir: todos exceto usuarios listados podem usa-lo
  • Se nenhum existir: muitas distros permitem apenas root (comportamento varia por distro)
# Permitir apenas um usuario especifico
$ echo 'deploy' | sudo tee -a /etc/at.allow

Em servidores compartilhados, o at pode se tornar um ponto de apoio para executar tarefas. Se voce nao precisa dele, restrinja com at.deny ou pare o atd. Se voce o usa operacionalmente, permita usuarios explicitamente via at.allow.

Resumo

  • at agenda uma tarefa unica; trabalho recorrente pertence ao cron
  • Tarefas so executam se o atd estiver ativo -- verifique o daemon primeiro quando nada acontecer
  • Prefira especificacoes relativas como now + N minutes; um horario passado rola para o dia seguinte
  • Gerencie tarefas com atq (listar) / atrm (remover) / at -c (inspecionar)
  • A saida vai para o email -- redirecione tarefas de producao para um arquivo de log

Proximas Leituras