Construtor de Cron
- Comece por um preset, se algum se aproximar do que você quer.
- Ajuste os cinco campos: minuto, hora, dia do mês, mês e dia da semana.
- A descrição em linguagem natural é atualizada a cada mudança — use-a para conferir se a expressão faz o que você imagina.
- Copie a expressão pronta para o seu crontab, CI ou agendador.
A ordem é sempre minuto, hora, dia do mês, mês e dia da semana. Minuto vai de 0 a 59, hora de 0 a 23, dia do mês de 1 a 31, mês de 1 a 12 e dia da semana de 0 a 6, com 0 sendo domingo.
O asterisco significa "todos os valores". A vírgula lista valores específicos, como 1,15. O hífen define um intervalo, como 1-5. A barra define um passo, como */15 para "a cada 15".
Um erro frequente é escrever */5 no campo de hora achando que significa "a cada 5 minutos". Nesse campo, quer dizer "a cada 5 horas".
Quando os dois campos têm valor diferente de asterisco, a maioria das implementações de cron os combina com OU, não com E.
Ou seja, 0 0 1 * 1 não significa "toda segunda-feira que caia no dia 1", e sim "todo dia 1 do mês E também toda segunda-feira" — bem mais execuções do que se espera.
Se você precisa de uma condição conjunta, deixe um dos dois campos como asterisco e faça a verificação restante dentro do próprio script.
O cron executa no fuso do servidor, não no seu. Um agendamento para 9h roda às 9h do servidor, o que pode ser outro horário para você.
O horário de verão cria dois casos incômodos: no dia em que o relógio adianta, uma execução agendada na hora pulada pode não acontecer; no dia em que atrasa, pode acontecer duas vezes. Tarefas críticas costumam rodar em UTC para escapar disso.
Vale lembrar que o cron não garante execução: se a máquina estiver desligada no horário, aquela ocorrência é simplesmente perdida.
Perguntas frequentes
Use */5 no primeiro campo: */5 * * * *. A barra é o operador de passo e vale para o campo em que aparece.
A convenção padrão é 0. Várias implementações também aceitam 7 como domingo, mas 0 é o valor seguro em qualquer ambiente.
Provavelmente porque você preencheu dia do mês e dia da semana ao mesmo tempo. A maioria das implementações combina os dois com OU, somando as execuções em vez de restringi-las.
São atalhos. @daily equivale a 0 0 * * *, @hourly a 0 * * * *, @weekly a 0 0 * * 0 e @monthly a 0 0 1 * *. Nem todo agendador aceita, mas o cron do Unix aceita.
No fuso do servidor onde o cron está configurado. Para evitar surpresa com horário de verão, muitos times padronizam os servidores em UTC.