1. Quando agendar vs. fila
Agendamento serve para tarefas periódicas previsíveis (backup, limpeza, relatório). Se o volume varia ou precisa de retry inteligente, prefira fila com worker.
2. Cron e systemd timers
crontab -e
# todo dia às 03:15
15 3 * * * /usr/local/bin/backup.sh >> /var/log/backup.log 2>&1
crontab -l
Em servidores modernos, systemd timers costumam ser melhores: logs no journal, dependências e restart controlado.
sudo systemctl enable --now backup.timer
systemctl list-timers
3. Task Scheduler
$action = New-ScheduledTaskAction -Execute "powershell.exe" -Argument "-File C:\scripts\backup.ps1"
$trigger = New-ScheduledTaskTrigger -Daily -At 3:15am
Register-ScheduledTask -TaskName "BackupDiario" -Action $action -Trigger $trigger -User "SYSTEM"
GUI: taskschd.msc. Prefira conta de serviço com menor privilégio e log em arquivo ou Event Viewer.
4. Equivalências lado a lado
- Listar jobs:
crontab -l / Get-ScheduledTask
- Logs:
journalctl -u backup.service / Event Viewer → Task Scheduler
- Rodar agora:
systemctl start backup.service / Start-ScheduledTask -TaskName BackupDiario
DICA Sempre redirecione stdout/stderr para log com rotação. Job silencioso que falha é incidente atrasado.
5. Checklist de produção
- Horário em UTC documentado
- Usuário dedicado, sem senha interativa
- Log + alerta se o job não rodou
- Teste manual do script antes de agendar
6. Comandos explicados
Cron e systemd timers
| Comando ou trecho | O que faz |
|---|
crontab -e | Abre o crontab do usuário atual para editar os agendamentos. |
15 3 * * * | Cinco campos de tempo. Aqui: minuto 15, hora 3, qualquer dia, mês e dia da semana. Ou seja, todo dia às 03:15. |
>> /var/log/backup.log | Acrescenta a saída normal do script ao arquivo, sem apagar o que já existe. |
2>&1 | Envia as mensagens de erro para o mesmo destino da saída normal. |
crontab -l | Lista os agendamentos atuais. |
systemctl enable --now backup.timer | Ativa o timer no boot e já o inicia. |
systemctl list-timers | Mostra os timers, o próximo disparo e o último. |
| Campo do cron | Valores |
|---|
| Minuto | 0 a 59 |
| Hora | 0 a 23 |
| Dia do mês | 1 a 31 |
| Mês | 1 a 12 |
| Dia da semana | 0 a 7 (0 e 7 são domingo) |
| Expressão | Quando roda |
|---|
*/5 * * * * | a cada 5 minutos |
0 2 * * 0 | domingo às 02:00 |
30 8 1 * * | dia 1 de cada mês às 08:30 |
0 9 * * 1-5 | de segunda a sexta às 09:00 |
Agendador de Tarefas (PowerShell)
| Comando | O que faz |
|---|
New-ScheduledTaskAction -Execute "powershell.exe" -Argument "-File ..." | Define o que executar: o programa e seus argumentos. |
New-ScheduledTaskTrigger -Daily -At 3:15am | Define o gatilho: todo dia às 03:15. |
Register-ScheduledTask -TaskName "BackupDiario" ... -User "SYSTEM" | Cria a tarefa com esse nome, rodando com a conta SYSTEM. |
7. Erros comuns e como resolver
| Sintoma | Causa provável | Solução |
|---|
| O script funciona manualmente, mas não pelo cron | O cron usa um PATH reduzido e outro diretório de trabalho. | Use caminhos absolutos para comandos e arquivos, ou faça cd no início do script. |
| O job falha e ninguém percebe | A saída e os erros não foram registrados. | Redirecione com >> arquivo.log 2>&1 e alerte quando o log não for atualizado. |
| Roda em horário diferente do esperado | O cron usa o fuso horário do servidor. | Documente o fuso (de preferência UTC) e confira com timedatectl. |
| A tarefa do Windows não roda sem ninguém logado | A tarefa foi criada para executar só com o usuário conectado. | Registre com uma conta de serviço ou SYSTEM e marque a execução com ou sem login. |