Conversor de temporizador systemd para expressão Cron

Converta a sintaxe OnCalendar= de um temporizador systemd para uma expressão cron (minuto hora dia mês dia da semana) de graça. O inverso do nosso conversor "Cron para temporizador systemd". Suporta atalhos nomeados (daily, weekly, etc.) e avisa sobre diferenças semânticas quando dia do mês e dia da semana são especificados juntos.

Mapeamento de componentes do systemd para campos do cron

Cada parte da sintaxe OnCalendar= do systemd corresponde a um dos cinco campos do cron da seguinte forma.

Posição Onde aparece no systemd Campo do cron
1 Minuto na parte de hora (MM em HH:MM:SS) Minuto
2 Hora na parte de hora (HH em HH:MM:SS) Hora
3 Dia na parte de data (dia em ano-mês-dia) Dia do mês
4 Mês na parte de data (mês em ano-mês-dia) Mês
5 Prefixo de dia da semana (ex.: Mon, Mon..Fri) Dia da semana

O campo de segundos do systemd (SS em HH:MM:SS) não tem equivalente no cron, então é ignorado na conversão (um aviso aparece se os segundos não forem "00").

Mapeamento de abreviações de dia do systemd para números de dia da semana do cron

O systemd usa abreviações em inglês para os dias da semana, enquanto o cron usa números de 0 a 6.

Abreviação de dia do systemd Número de dia da semana no cron
Sun 0
Mon 1
Tue 2
Wed 3
Thu 4
Fri 5
Sat 6

Mapeamento de atalhos nomeados do systemd para expressões cron

O systemd tem atalhos nomeados legíveis como "daily" e "weekly", e esta ferramenta também pode convertê-los em expressões cron.

OnCalendar= Expressão cron
minutely * * * * *
hourly 0 * * * *
daily / midnight 0 0 * * *
weekly 0 0 * * 1
monthly 0 0 1 * *
yearly / annually 0 0 1 1 *

Exemplos comuns de conversão

OnCalendar= Expressão cron Significado
*-*-* *:*:00 * * * * * Executa a cada minuto (equivalente a "* * * * *" no cron).
*:00/15:00 */15 * * * * Executa a cada 15 minutos.
Mon..Fri 09:00:00 0 9 * * 1-5 Executa às 9h nos dias úteis (segunda a sexta).
*-*-01 00:00:00 0 0 1 * * Executa à meia-noite no dia 1 de cada mês.
*-01-01 00:00:00 0 0 1 1 * Executa à meia-noite em 1º de janeiro todo ano.
Mon *-*-01 00:00:00 0 0 1 * 1 Um exemplo que especifica tanto um dia do mês (o dia 1) quanto um dia da semana (segunda-feira). O systemd trata isso como uma condição AND (só executa quando ambos coincidem), mas o cron interpreta como uma condição OR (executa quando qualquer um coincide) — então o resultado convertido executa com mais frequência do que a expressão OnCalendar original pretendia.

Uma expressão OnCalendar que restringe tanto o dia do mês quanto o dia da semana a algo diferente de "*" não pode ser convertida com precisão para cron (systemd usa lógica AND, cron usa lógica OR). Sempre verifique o significado do resultado da conversão em casos assim.

Dicas de uso

  • Você pode digitar atalhos nomeados como "daily", "weekly" ou "monthly" diretamente — eles são convertidos internamente para a expressão cron equivalente (por exemplo, "daily" vira "0 0 * * *").
  • Restringir tanto o dia do mês quanto o dia da semana a algo diferente de "*" muda o significado ao converter a lógica AND do systemd na lógica OR do cron. Verifique o aviso nesse caso e confirme se o resultado corresponde à sua intenção.
  • Os campos de ano e segundos do OnCalendar não têm equivalente no cron, então são descartados na conversão (um aviso notifica quando isso acontece).
  • Útil ao migrar cargas de trabalho para fora do systemd — por exemplo, ao mover uma tarefa agendada para um Kubernetes CronJob (que usa sintaxe estilo cron).
  • Para programações simples que não combinam restrições de dia da semana e data (a cada hora, diária, semanal etc.), essa conversão é sempre exata.

Perguntas frequentes

Isso surge ao migrar para um contêiner Docker leve que não tem systemd, ao reproduzir a mesma programação em um Kubernetes CronJob (que usa sintaxe estilo cron), ou quando as ferramentas da sua equipe só suportam configuração no formato cron.

Sim. Digitar atalhos nomeados do systemd como "minutely", "hourly", "daily", "weekly", "monthly" ou "yearly" diretamente os converte para a expressão cron equivalente.

Na sintaxe OnCalendar do systemd, uma restrição de dia da semana e uma restrição de data são sempre combinadas com lógica AND (ambas devem coincidir). Já na semântica clássica do Vixie cron, restringir tanto o dia do mês quanto o dia da semana a algo diferente de "*" as transforma em uma condição OR (basta uma das duas coincidir). Esta ferramenta detecta esse caso e mostra um aviso de que o resultado convertido pode ser mais amplo (executar com mais frequência) do que a expressão OnCalendar original.

Expressões cron não têm campo para o ano, então qualquer restrição de ano em uma expressão OnCalendar (qualquer valor diferente de "*") é ignorada na conversão. Esta ferramenta mostra um aviso nesse caso, indicando que o resultado convertido executa todo ano, independentemente do ano especificado.

A ferramenta cobre os principais padrões que nossa ferramenta "Cron para temporizador systemd" gera (por minuto, a cada hora, diário, semanal, mensal, anual, passos, intervalos, listas, restrições de dia da semana e atalhos nomeados). Porém, como a sintaxe OnCalendar é mais expressiva que o cron, especificações muito complexas — vários anos, repetições com precisão de segundos — não podem ser representadas com exatidão no cron e podem falhar na conversão.
ツールくん

Curiosidade — O que significa devolver um temporizador systemd para cron

Migrações tecnológicas costumam ser vistas como algo unidirecional — passar de um mecanismo antigo para um mais novo —, mas na prática a conversão reversa também aparece bastante. Mover uma carga de trabalho de um host baseado em systemd para um contêiner leve que só suporta cron, ou para uma ferramenta de orquestração que usa sintaxe de agendamento estilo cron (como o Kubernetes CronJob), significa converter a sintaxe OnCalendar de volta para uma expressão cron.

Essa "conversão reversa" não é um simples mapeamento um-para-um, porque a sintaxe OnCalendar do systemd é mais expressiva que o cron. Ela suporta conceitos que os cinco campos do cron simplesmente não conseguem representar — restrições em nível de ano, precisão de segundos e uma combinação do tipo AND entre data e dia da semana. Por isso esta ferramenta busca converter com precisão os padrões de uso comum, tratando qualquer coisa mais complexa como um erro de conversão em vez de tentar uma aproximação.

A diferença semântica quando tanto o dia do mês quanto o dia da semana são especificados — lógica AND no systemd versus lógica OR no cron — é a maior armadilha dessa conversão reversa. Uma condição como "o dia 1 do mês" E "segunda-feira" restringe o systemd apenas aos dias que são ao mesmo tempo o dia 1 e uma segunda-feira, mas o cron executaria em qualquer dia que seja o dia 1 ou uma segunda-feira. Esta ferramenta avisa isso explicitamente para que essa mudança de significado, fácil de passar despercebida, não escape durante uma migração.