Comando at: Agendamento de Tarefas Únicas no Linux

Comando at: Agendamento de Tarefas Únicas no Linux

O Que Você Vai Aprender

  • Como agendar uma tarefa única com at
  • Como listar e cancelar tarefas pendentes com atq / atrm
  • Quando usar at ao invés de cron

Resumo Rápido

  • Executar uma vez em um horário definido --> at
  • Executar repetidamente em um agendamento --> cron / timer do systemd
  • Confirme que o atd está em execução primeiro; atq e atrm são tudo que você 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 são necessários (frequentemente não instalados por padrão)

O Que é o Comando at?

Conclusão: at executa um comando uma vez em um horário especificado. Ele é feito para tarefas únicas e não recorrentes.

Enquanto o cron lida com tarefas recorrentes ("todo dia", "toda semana"), o at lida com execução agendada única -- "uma vez hoje à noite às 23h" ou "uma vez, daqui a 5 minutos".

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

Uma ferramenta relacionada é o batch. Em vez de um horário, o batch executa uma tarefa quando a carga do sistema cai abaixo de um limite. Use-o para empurrar trabalho pesado para fora dos períodos de pico.

O at Está Pronto para Usar? Verificando e Instalando o atd

Conclusão: Ter o binário do at não é suficiente -- tarefas só são executadas se o atd estiver ativo. Verifique o daemon primeiro.

Em muitos sistemas Ubuntu / Debian o at não vem instalado por padrão. 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 não estiver active (running), inicie e habilite:

$ sudo systemctl enable --now atd

A causa mais comum de "minha tarefa nunca executou" é um atd parado. Você pode registrar uma tarefa normalmente, mas se o atd estiver parado nada acontece quando o horário chega.

Como Agendar uma Tarefa?

Conclusão: 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, você recebe um número de tarefa e o horário agendado.

A partir de um arquivo (recomendado)

Entrada interativa é propensa a erros. Na prática, 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 diretório de trabalho, variáveis de ambiente e umask são salvos no momento do envio e restaurados na execução. Ainda assim, evite depender do PATH -- escreva comandos com caminhos absolutos.

Como Escrever a Especificação de Horário?

Conclusão: Você pode usar HH:MM, now + N unidades, midnight / noon / teatime, e datas explícitas. Especificações relativas são as mais práticas.

O at aceita expressões de tempo flexíveis. Padrões comuns:

Formato Significado
at 23:00 23h hoje (amanhã se já passou)
at 10:00 AM 10 da manhã
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 manhã de amanhã
at 10:00 next week Mesmo dia da semana na próxima semana, 10:00
at 2026-12-31 23:59 Data e hora explícitas
# Exemplo: rotacionar logs as 3h de amanha
$ echo '/usr/local/bin/rotate-logs.sh' | at 3:00 tomorrow

Se você informar um horário que já passou hoje, o at interpreta como o mesmo horário amanhã. Uma tarefa que você esperava executar "imediatamente" pode escorregar para o dia seguinte. Para mirar confiavelmente no futuro próximo, use now + N minutes.

Como Listar e Cancelar Tarefas?

Conclusão: Liste com atq, remova com atrm JOBID e inspecione com at -c JOBID. Esses três 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 são número da tarefa / horário agendado / fila / proprietário. a é a fila normal; b é a fila do batch.

Remover uma tarefa (atrm)

$ atrm 3

Exclua pelo número. Você pode remover várias de uma vez:

$ atrm 3 5

Inspecionar uma tarefa (at -c)

Para ver exatamente o que está agendado antes da execução, use -c:

$ at -c 5

Ele imprime o bloco de restauração de ambiente salvo e o corpo real do comando.

atq é o mesmo que at -l, e atrm é o mesmo que at -d. Em scripts, os nomes explícitos atq / atrm são mais claros de ler.

Para Onde Vai a Saída?

Conclusão: O stdout e stderr de uma tarefa são enviados ao usuário por email local. Sem um servidor de email, a saída é perdida -- redirecione para um arquivo.

A saída de uma tarefa at não vai para seu terminal; ela vai para o email local do usuário que a submeteu. Leia com mail ou em /var/mail/<user>.

Em um servidor sem MTA (entrega de email), a saída é simplesmente descartada. Para manter resultados de forma confiável, redirecione dentro da tarefa:

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

Se uma tarefa "executou mas não deixou resultado", provavelmente foi para o email, ou você esqueceu de definir um destino de saída. Sempre redirecione tarefas de produção para um arquivo de log com > ... 2>&1.

Quando Usar at ao Invés de cron?

Conclusão: Use cron / timer do systemd para trabalho recorrente e at para trabalho único. "Apenas esta noite" ou "uma vez após a manutenção" se encaixa melhor no at.

Caso de uso Recomendado
Recorrente (diário, semanal) cron / timer systemd
Uma vez em um horário definido at
Executar quando a carga cair batch
Tarefas recorrentes confiáveis (logs, deps) timer systemd

Escrever uma tarefa única no cron e esquecer de removê-la -- fazendo-a disparar novamente no dia seguinte -- é um erro comum. Quando você sabe que é de uso único, o at não precisa de limpeza e é mais seguro.

Para tarefas recorrentes em geral, veja Básico do cron e Timer do systemd vs cron.

Controle de Acesso e Ressalvas

Conclusão: O acesso ao at é controlado por /etc/at.allow e /etc/at.deny. Se at.allow existir, ele tem prioridade.

  • Se /etc/at.allow existir: apenas usuários listados podem usar o at
  • Se at.allow estiver ausente mas /etc/at.deny existir: todos exceto usuários listados podem usá-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 você não precisa dele, restrinja com at.deny ou pare o atd. Se você o usa operacionalmente, permita usuários explicitamente via at.allow.

Resumo

  • at agenda uma tarefa única; trabalho recorrente pertence ao cron
  • Tarefas só executam se o atd estiver ativo -- verifique o daemon primeiro quando nada acontecer
  • Prefira especificações relativas como now + N minutes; um horário passado rola para o dia seguinte
  • Gerencie tarefas com atq (listar) / atrm (remover) / at -c (inspecionar)
  • A saída vai para o email -- redirecione tarefas de produção para um arquivo de log

Próximas Leituras