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.
Reescrever uma expressão cron como temporizador do systemd
Transferir um agendamento de `cron` para um temporizador do `systemd` supõe traduzir os cinco campos de minuto, hora, dia do mês, mês e dia da semana para a sintaxe `OnCalendar=`. Insira uma expressão cron e esta ferramenta produz o `OnCalendar=` correspondente, junto com advertências sobre tudo o que mereça cuidado.
**O mais importante desta tradução é como se comportam o dia do mês e o dia da semana quando ambos são dados.** O cron os lê como uma **disjunção**: `0 0 1 * 1` significa "o primeiro do mês **ou** toda segunda-feira" e pode disparar umas cinco vezes por mês. **O `OnCalendar=` do systemd, em contrapartida, trata a mesma especificação como uma conjunção.** Passa a significar "o primeiro **e** que seja segunda-feira", e dispara uma ou duas vezes por ano. **Uma tradução mecânica altera, pois, a frequência com que a tarefa corre, e o faz em silêncio.** Esta ferramenta detecta essa combinação e lhe adverte.
Como converter
- Insira a expressão cron Escreva os cinco campos — minuto, hora, dia do mês, mês, dia da semana — separados por espaços.
- Revise o OnCalendar= gerado É-lhe entregue a sintaxe do systemd correspondente.
- Leia as advertências **Ali onde são dados ao mesmo tempo dia do mês e dia da semana, aponta-se-lhe a mudança de significado.**
- Transcreva-o para uma unidade de temporizador Cole-o na seção `[Timer]` de um arquivo `.timer`.
Dicas para aproveitar melhor
- 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.
Quando é útil
Transferir-se para um ambiente de contêineres
**Os contêineres muitas vezes não levam daemon cron, de modo que os agendamentos hão de passar a temporizadores do systemd ou a outro arranjo.**
Querer registro do que foi executado
Um temporizador do systemd deixa o seu rastro no journald, que pode ser seguido depois.
Querer dependências entre tarefas
**Correr só depois que outra unidade tiver arrancado é algo que o cron não sabe exprimir.**
Fazer inventário dos agendamentos existentes
Converter um conjunto de expressões cron de uma vez lhe dá ocasião de conferir que os intervalos são os que queria.
Termos dos agendadores
- Expressão cron
- A sintaxe que exprime uma hora mediante cinco campos: minuto, hora, dia do mês, mês e dia da semana. **O dia do mês e o da semana são lidos como disjunção.**
- OnCalendar=
- A chave que indica a hora num temporizador do systemd. **O dia do mês e o da semana são lidos como conjunção.**
- Unidade de temporizador
- Um arquivo com a extensão `.timer`, que arranca o `.service` de mesmo nome.
- Persistent=
- **O ajuste que faz um temporizador pôr-se em dia após a inicialização se o sistema estava desligado quando deveria disparar.** Obra de maneira parecida ao `anacron` para o cron.
- AccuracySec=
- A tolerância sobre a hora de disparo. Por padrão vigora um minuto de folga, então indique-a ali onde a hora deva ser exata.
- Journald
- A coleta de registros do systemd. A saída de uma tarefa arrancada por um temporizador guarda-se também aqui.
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.