Conversor de Expressão Cron para Timer systemd
Ferramenta gratuita para converter uma expressão cron (minuto hora dia mês dia da semana) na sintaxe OnCalendar= dos timers do systemd. Avisa sobre a semântica OR dia-do-mês/dia-da-semana, útil ao migrar tarefas cron para ambientes Docker/Kubernetes.
Correspondência entre campos do cron e componentes do systemd
Os 5 campos de uma expressão cron correspondem à sintaxe OnCalendar= do systemd da seguinte forma.
| Posição | Campo cron | Equivalente no systemd |
|---|---|---|
| 1 | Minuto | Minuto da parte de hora (MM em HH:MM:SS) |
| 2 | Hora | Hora da parte de hora (HH em HH:MM:SS) |
| 3 | Dia do mês | Dia da parte de data (dia em ano-mês-dia) |
| 4 | Mês | Mês da parte de data (mês em ano-mês-dia) |
| 5 | Dia da semana | Prefixo de dia da semana (ex.: Mon, Mon..Fri) |
Como o cron não tem campo de segundos, o componente de segundos do systemd é sempre "00". Quando dia do mês e mês não estão restritos (*), a parte ano-mês-dia do systemd pode ser omitida por completo.
Número do dia da semana no cron e abreviação no systemd
O cron representa os dias da semana com números de 0 a 7, enquanto o systemd usa abreviações em inglês.
| Número do dia no cron | Abreviação no systemd |
|---|---|
| 0 (7) | Sun |
| 1 | Mon |
| 2 | Tue |
| 3 | Wed |
| 4 | Thu |
| 5 | Fri |
| 6 | Sat |
Exemplos comuns de conversão
| Expressão cron | OnCalendar= | Significado |
|---|---|---|
| * * * * * | OnCalendar=*-*-* *:*:00 | Executa a cada minuto (equivalente a "* * * * *" no cron). |
| */15 * * * * | OnCalendar=*:00/15:00 | Executa a cada 15 minutos. |
| 0 9 * * 1-5 | OnCalendar=Mon..Fri 09:00:00 | Executa às 9h de segunda a sexta-feira. |
| 0 0 1 * * | OnCalendar=*-*-01 00:00:00 | Executa à meia-noite do dia 1 de cada mês. |
| 0 0 1 1 * | OnCalendar=*-01-01 00:00:00 | Executa à meia-noite de 1º de janeiro de cada ano. |
| 0 0 1 * 1 | OnCalendar=Mon *-*-01 00:00:00 | Exemplo com dia do mês (dia 1) e dia da semana (segunda-feira) especificados ao mesmo tempo. No cron isso é uma condição OR (executa se qualquer um dos dois corresponder), mas no systemd torna-se uma condição AND (só executa se ambos corresponderem), portanto o resultado convertido executa com menos frequência que a expressão cron original. |
Uma expressão cron que restringe tanto o dia do mês quanto o dia da semana (nenhum é "*") não pode ser convertida com precisão para a sintaxe OnCalendar do systemd, pois o cron usa semântica OR nesse caso, enquanto o systemd sempre usa semântica AND. Considere dividir esses casos em dois timers systemd separados.
Dicas
- Se você restringir tanto o dia do mês quanto o dia da semana para algo diferente de "*", a condição OR do cron não pode ser representada com exatidão pela condição AND do systemd. Verifique o aviso no resultado e considere dividir em dois timers, se necessário.
- Algumas imagens base mínimas de contêiner (por exemplo, imagens Docker baseadas em Alpine) não incluem nenhum daemon cron, tornando os timers do systemd um substituto prático ao migrar tarefas agendadas.
- Você pode validar a linha OnCalendar gerada com o comando "systemd-analyze calendar", que também mostra os próximos horários de execução agendados.
- Diferente de uma única linha do crontab, um timer do systemd é composto por dois arquivos: uma unidade .timer (o agendamento) e uma unidade .service (a tarefa realmente executada).
- Para agendamentos simples que não combinam dia do mês e dia da semana (a cada hora, diário, semanal etc.), esta conversão é sempre exata.
Perguntas frequentes
Curiosidade — Do cron aos timers do systemd
O systemd surgiu por volta de 2010 como um sistema de inicialização para gerenciar o processo de boot do Linux, e desde então se tornou o padrão na maioria das distribuições. Seu recurso de timers oferece execução periódica de forma semelhante ao cron, mas adiciona capacidades que o cron nunca teve: resolução de dependências, registro centralizado de execuções via journalctl e comportamento de nova tentativa configurável em caso de falha.
Enquanto isso, ambientes de contêiner como Docker e Kubernetes oferecem cada vez mais imagens base sem nenhum daemon cron, para manter o tamanho da imagem reduzido. Quando uma tarefa periódica precisa ser executada nesses ambientes, as opções práticas são depender de um mecanismo em nível de orquestrador, como um CronJob do Kubernetes, ou delegar aos timers do systemd caso o próprio host execute systemd.
A sintaxe OnCalendar= é mais expressiva que os 5 campos do cron, suportando precisão em nível de ano e de segundos, mas justamente por essa maior expressividade, algumas expressões cron (aquelas que restringem tanto dia do mês quanto dia da semana como condição OR) mudam de significado em uma conversão ingênua. Esta ferramenta exibe esse aviso explicitamente para que as migrações não tropecem em uma armadilha fácil de passar despercebida.