Skip to content

Agendamento cron

Cron a cada 10 minutos

A expressão cron para rodar a cada 10 minutos é */10 * * * *. Ela dispara nos minutos 0, 10, 20, 30, 40 e 50 de toda hora, 144 vezes por dia.

A cada 10 minutos
Expressão*/10 * * * *
Execuções144 vezes por dia
OnCalendar do systemd*:0/10

Como funciona

O */10 percorre o campo de minuto a partir do 0 de dez em dez, o que dá seis valores por hora. Escrito como lista fica 0,10,20,30,40,50 * * * *, e as duas formas são equivalentes.

Dez minutos funciona redondo porque 10 divide 60. O passo recomeça no 0 a cada hora, então a última execução de uma hora (:50) e a primeira da seguinte (:00) ficam a 10 minutos de distância, como qualquer outro par.

É justamente essa propriedade que quebra em intervalos que não dividem 60, e esse é o mal-entendido mais comum do cron depois de fuso horário. As armadilhas abaixo mostram o que o */7 faz de verdade.

Explicação campo a campo
CampoValorSignificado
Minuto*/10a cada 10 minutos: 0, 10, 20, 30, 40, 50
Hora*toda hora
Dia do mês*todo dia do mês
Mês*todo mês
Dia da semana*todo dia da semana

Próximas execuções

Relógio do agendador

Como no GitHub Actions sem timezone, na Vercel, na Cloudflare e no Kubernetes com timeZone "Etc/UTC".

Próximas execuções, calculadas no seu navegador a partir de agora
ExecuçãoSeu horárioUTC
1Calculando… 
2  
3  
4  
5  

Versões prontas para colar

O mesmo agendamento em cada agendador, com o que muda em cada um.

crontab (Linux, macOS, BSD)

crontab -e
# m h dom mon dow  command
*/10 * * * * /usr/local/bin/job.sh >> /var/log/job.log 2>&1

# Same, but skip a run while the previous one is still going:
*/10 * * * * flock -n /tmp/job.lock /usr/local/bin/job.sh
  • O cron usa o fuso horário do servidor. No cronie (Fedora, RHEL), CRON_TZ=America/Sao_Paulo numa linha acima muda o fuso das linhas seguintes.

GitHub Actions

.github/workflows/scheduled.yml
on:
  schedule:
    - cron: '*/10 * * * *'
  workflow_dispatch: {}
  • Roda em UTC, a menos que você defina timezone, e só no branch padrão. A documentação do GitHub avisa que execuções agendadas podem atrasar em horários de pico e que, em repositórios públicos, o agendamento é desativado após 60 dias sem atividade.

CronJob do Kubernetes

cronjob.yaml
apiVersion: batch/v1
kind: CronJob
metadata:
  name: scheduled-job
spec:
  schedule: "*/10 * * * *"
  timeZone: "Etc/UTC"
  concurrencyPolicy: Forbid
  jobTemplate:
    spec:
      template:
        spec:
          restartPolicy: OnFailure
          containers:
            - name: job
              image: busybox:1.36
              command: ["/bin/sh", "-c", "date; echo running"]
  • spec.timeZone é estável desde o Kubernetes 1.27; sem ele, vale o fuso do kube-controller-manager. concurrencyPolicy: Forbid pula uma execução se a anterior ainda estiver rodando.

Cron Jobs da Vercel

vercel.json
{
  "crons": [
    { "path": "/api/cron", "schedule": "*/10 * * * *" }
  ]
}
  • A Vercel sempre usa UTC, não aceita nomes como MON ou JAN e não deixa definir dia do mês e dia da semana ao mesmo tempo.
  • Roda mais de uma vez por dia, então precisa do plano Pro ou Enterprise. No Hobby, a documentação diz que o deploy falha com expressões que rodam mais de uma vez por dia.

Cloudflare Workers

wrangler.toml
[triggers]
crons = ["*/10 * * * *"]
  • Cron Triggers rodam em UTC. Mudanças podem levar até 15 minutos para se propagar pela rede da Cloudflare.

node-cron (Node.js)

scheduler.js
import cron from 'node-cron';

// 6 campos: o primeiro (segundos) é opcional
cron.schedule('0 */10 * * * *', async () => {
  await runJob();
}, { timezone: 'UTC', noOverlap: true });
  • O agendamento vive dentro do processo Node: se ele cair, nada roda; se houver três réplicas, a tarefa roda três vezes. noOverlap pula um disparo enquanto o anterior não terminou.

Timer do systemd

job.timer + job.service
# /etc/systemd/system/job.timer
[Unit]
Description=Run job.service every 10 minutes

[Timer]
OnCalendar=*:0/10

[Install]
WantedBy=timers.target

# /etc/systemd/system/job.service
[Service]
Type=oneshot
ExecStart=/usr/local/bin/job.sh

# systemctl daemon-reload && systemctl enable --now job.timer
  • Confira com systemd-analyze calendar '*:0/10', que mostra a forma normalizada e a próxima execução. AccuracySec padrão é 1min, então o disparo pode variar até um minuto.

Spring @Scheduled e Quartz

Java
@Scheduled(cron = "0 */10 * * * *", zone = "UTC")
public void runJob() {
    // ...
}

// Quartz CronTrigger:
CronScheduleBuilder.cronSchedule("0 0/10 * * * ?")
  • No Spring, o primeiro dos 6 campos são os segundos; o resto segue o cron comum (0 ou 7 = domingo).
  • No Quartz, um dos campos de dia precisa ser ?, por isso o dia da semana leva ?.

Armadilhas

Passos que não dividem 60 deixam um intervalo curto

*/7 * * * * roda em 0, 7, 14, …, 49, 56 e depois 0 de novo: o intervalo na virada da hora é de 4 minutos, não 7. */25 roda em 0, 25, 50 e depois 0, um intervalo de 10 minutos. O passo só se repete dentro do campo. Para um intervalo fixo de verdade, o crontab(5) sugere rodar a cada minuto e testar o epoch: [ $(( $(date +\%s) / 60 \% 7 )) -eq 0 ] && job.sh.

Escalonar várias tarefas de 10 minutos

Duas tarefas em */10 começam juntas. Dê um deslocamento para cada uma com faixa e passo: 3-59/10 roda em 3, 13, 23, …, 53 e 7-59/10 em 7, 17, …, 57.

0/10 não é portável

GitHub Actions, Quartz e a maioria das bibliotecas leem 0/10 como “a partir do 0, de 10 em 10”. O cronie rejeita passo depois de um número solto e exige 0-59/10 ou */10. Fique com */10.

Perguntas frequentes

Qual é a expressão cron para a cada 10 minutos?
*/10 * * * *, que roda nos minutos 0, 10, 20, 30, 40 e 50 de toda hora. A lista 0,10,20,30,40,50 * * * * é equivalente.
Como rodar a cada 10 minutos entre 9h e 17h?
*/10 9-16 * * * roda das 09:00 às 16:50. Use 9-17 se quiser também de 17:00 a 17:50.
Por que */7 não roda exatamente a cada 7 minutos?
O passo recomeça no 0 a cada hora. */7 casa com 0, 7, …, 56, então depois do 56 o próximo é o 0 da hora seguinte, só 4 minutos depois.
Qual é o OnCalendar do systemd para cada 10 minutos?
OnCalendar=*:0/10, que o systemd-analyze calendar normaliza para *-*-* *:00/10:00.

Revisado em por Arielton Oberek.