TL;DR (Respostas rápidas sobre cron)
- Cron expression (Unix): 
minute hour day-of-month month day-of-week→ 5 campos. - Variantes Quartz/Spring: normalmente 6 ou 7 campos (adicionam seconds, às vezes year) e o wildcard especial **
?** para no specific value em DOM/DOW. - Kubernetes CronJob: 
spec.scheduleusa o formato cron standard; clusters recentes suportamspec.timeZonepara schedules baseados na hora local. - Boa prática: Testa e monitoriza sempre os teus cron jobs; regista as saídas e define alertas para falhas.
 
O que é o Cron?
Cron é um scheduler de tarefas baseado no tempo em sistemas tipo Unix. Executa comandos a intervalos definidos usando cron expressions. Cada linha no teu crontab declara quando e o quê executar.
Onde corre o cron:
- System crontab: 
/etc/crontab(tem um campo de utilizador) - User crontab: 
crontab -epor utilizador 
Strings predefinidas como
@hourly,@daily,@weekly,@monthly,@rebootsão atalhos que podes usar em vez de escrever expressões completas.
Sintaxe de cron expressions (Unix / estilo POSIX)
Formato (5 campos):
┌───────────── minute (0–59)
│ ┌─────────── hour (0–23)
│ │ ┌───────── day of month (1–31)
│ │ │ ┌─────── month (1–12 or JAN–DEC)
│ │ │ │ ┌───── day of week (0–6 or SUN–SAT; 0 or 7 = Sunday on many systems)
│ │ │ │ │
│ │ │ │ │
* * * * *
Wildcards & operadores
*any value,list →1,2,5-range →1-5/step →*/10L,W,#são extensões não standard (comuns em Quartz, não no cron Unix clássico).
Exemplos
- A cada 15 minutos: 
*/15 * * * * - Diário às 02:00: 
0 2 * * * - Dias úteis às 18:30: 
30 18 * * 1-5 - Primeiro dia do mês às 07:00: 
0 7 1 * * 
Dica de portabilidade: Evita depender de modificadores não standard a menos que o teu scheduler os documente. O cron Unix clássico não aceita
?,L,Wou#.
Quartz Cron / Spring Cron vs Unix Cron (diferenças a ter em conta)
Muitos schedulers de aplicação (ex.: Quartz, Spring) usam uma sintaxe estendida:
- Campos: 
seconds minutes hours day-of-month month day-of-week [year]→ 6 ou 7 campos - Especial 
?: usado em day-of-month ou day-of-week para significar no specific value - Modificadores estendidos como 
L(last),W(weekday),#(nth weekday) são frequentemente suportados. 
Mapeamento rápido
- Unix: 
0 2 * * *→ diário às 02:00 - Quartz/Spring (com seconds): 
0 0 2 * * ?→ diário às 02:00 (sem DOW específico) 
Armadilhas comuns
- Colar uma expressão de 5 campos de Unix em Spring/Quartz não vai funcionar. Adiciona seconds (e às vezes year) ou usa um helper para converter.
 ?é inválido em Unix cron mas é necessário em alguns cenários de Quartz.
Kubernetes CronJobs (k8s)
- Define schedules via 
spec.schedule(formato cron standard). - Versões recentes de Kubernetes suportam 
spec.timeZone, permitindo fixar um fuso horário IANA (por ex.,"Europe/Zurich"). Sem isso, os schedules são avaliados no fuso do controller (muitas vezes UTC). 
Exemplo
apiVersion: batch/v1
kind: CronJob
metadata:
  name: db-backup
spec:
  schedule: '0 2 * * *' # 02:00 diário
  timeZone: 'Europe/Zurich' # garante schedule em hora local (suportado em clusters modernos)
  successfulJobsHistoryLimit: 3
  failedJobsHistoryLimit: 1
  jobTemplate:
    spec:
      template:
        spec:
          restartPolicy: OnFailure
          containers:
            - name: backup
              image: alpine:3.20
              command: [ 'sh', '-lc', 'pg_dump $DB_URL > /backups/$(date +%F).sql' ]
Gerador / Decoder de cron expressions (inline)
Usa a referência rápida abaixo para construir ou decodificar schedules. Copia/cola no teu crontab ou num CronJob de k8s.
Padrões rápidos
| Linguagem natural | Unix cron | Quartz/Spring | 
|---|---|---|
| A cada minuto | * * * * * | 0 * * * * ? | 
| A cada 5 minutos | */5 * * * * | 0 */5 * * * ? | 
| De hora a hora às :30 | 30 * * * * | 0 30 * * * ? | 
| Diário 02:00 | 0 2 * * * | 0 0 2 * * ? | 
| Dias úteis 18:30 | 30 18 * * 1-5 | 0 30 18 ? * MON-FRI | 
| 1.º dia do mês 07:00 | 0 7 1 * * | 0 0 7 1 * ? | 
| Domingos 00:00 | 0 0 * * 0 | 0 0 0 ? * SUN | 
| Último dia do mês 23:00 | (não standard em Unix) | 0 0 23 L * ? | 
Dicas de decode
- Qualquer 
*/N→ executa a cada N unidades desse campo. - DOM e DOW ambos definidos → o comportamento varia por implementação; fica-te por um (ou usa 
?em Quartz). 
Noções básicas de crontab
- Editar: 
crontab -e - Listar: 
crontab -l - Ambiente: define 
PATH,SHELL,MAILTOe variáveis explicitamente—cron corre com um ambiente mínimo. - Saída: encaminha com 
>> /var/log/myjob.log 2>&1ou usa o mail do sistema. 
Checklist de debugging de cron
- O comando é executável como o mesmo utilizador?
 - Estás a usar caminhos absolutos para binários e ficheiros?
 - O ambiente (PATH, LANG, TZ) está definido?
 - A expressão é válida para a “flavour” do teu scheduler?
 - As falhas estão a ser monitorizadas/com alertas?
 
Monitoring & fiabilidade
- Encaminha saídas para logs e alerta quando os exit codes forem ≠ 0.
 - Considera monitores dedicados (health pings, heartbeats) que alertam quando execuções falham ou faltam.
 - Em Kubernetes, observa os estados dos Job, ajusta backoffLimit e mantém algum histórico.
 
Cron FAQs
Unix cron usa 5 campos e não suporta ?, L, W ou #. Quartz/Spring usam 6–7 campos (adicionam seconds/year) e permitem ? além de modificadores de data.
Adiciona no início o campo seconds (normalmente 0) e usa ? em DOM ou DOW se o outro estiver especificado. Exemplo: Unix 0 2 * * * → Spring 0 0 2 * * ?.
Por omissão os schedules são avaliados no fuso do controller (muitas vezes UTC). Clusters modernos suportam spec.timeZone para forçar um fuso horário IANA como "Europe/Zurich".
O cron clássico não agenda intervalos inferiores a um minuto. Usa systemd timers, um loop com sleep, schedulers de aplicação ou Quartz (com o campo seconds).
Cron corre com um ambiente mínimo e possivelmente com outro utilizador. Define caminhos absolutos e PATH; testa com o mesmo utilizador; regista erros explicitamente.
Não diretamente no cron clássico. Usa duas entradas (desfasadas 30 minutos) ou um wrapper com um scheduler mais inteligente.
Usa um mecanismo não concorrente no código do job (locks) ou configura concurrencyPolicy: Forbid no spec do CronJob.
Significa “sem valor específico” e só é válido nos campos day-of-month ou day-of-week, tipicamente quando o outro está especificado.
Normalmente sim, mas as strings predefinidas podem variar entre implementações; prefere a forma explícita de 5 campos para portabilidade.
Cron Checklist
- Identifica a “flavour” do scheduler (Unix, systemd timer, Quartz/Spring, k8s).
 - Normaliza as expressões para essa “flavour” (5 vs 6/7 campos, símbolos especiais).
 - Define explicitamente o fuso horário e o comportamento em DST.
 - Adiciona monitoring (heartbeat + alertas de falha).
 - Documenta responsabilidade, runbooks e caminhos de escalada.