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
atao invés decron
Resumo Rápido
- Executar uma vez em um horário definido -->
at - Executar repetidamente em um agendamento -->
cron/ timer do systemd - Confirme que o
atdestá em execução primeiro;atqeatrmsão tudo que você precisa para gerenciar tarefas
Premissas (ambiente alvo)
- SO: Ubuntu / Debian (sistemas baseados em RHEL funcionam da mesma forma)
- O pacote
ate o daemonatdsão necessários (frequentemente não instalados por padrão)
O Que é o Comando at?
Conclusão:
atexecuta 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
atnão é suficiente -- tarefas só são executadas se oatdestiver 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 comCtrl+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 comatrm JOBIDe inspecione comat -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 eatpara trabalho único. "Apenas esta noite" ou "uma vez após a manutenção" se encaixa melhor noat.
| 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.allowe/etc/at.deny. Seat.allowexistir, ele tem prioridade.
- Se
/etc/at.allowexistir: apenas usuários listados podem usar oat - Se
at.allowestiver ausente mas/etc/at.denyexistir: 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
atagenda uma tarefa única; trabalho recorrente pertence aocron- Tarefas só executam se o
atdestiver 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