<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Cristopher Paiva</title>
    <description>The latest articles on DEV Community by Cristopher Paiva (@cristopherpds).</description>
    <link>https://dev.to/cristopherpds</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F502806%2F4b41e386-c1d4-446c-a4ac-87aae07941de.png</url>
      <title>DEV Community: Cristopher Paiva</title>
      <link>https://dev.to/cristopherpds</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/cristopherpds"/>
    <language>en</language>
    <item>
      <title>Modernizando a Automação no Linux: Por que e como migrar do Cron para systemd Timers</title>
      <dc:creator>Cristopher Paiva</dc:creator>
      <pubDate>Mon, 29 Jun 2026 07:53:08 +0000</pubDate>
      <link>https://dev.to/cristopherpds/modernizando-a-automacao-no-linux-por-que-e-como-migrar-do-cron-para-systemd-timers-1amf</link>
      <guid>https://dev.to/cristopherpds/modernizando-a-automacao-no-linux-por-que-e-como-migrar-do-cron-para-systemd-timers-1amf</guid>
      <description>&lt;p&gt;Se você trabalha com Linux, provavelmente já usou o &lt;strong&gt;Cron&lt;/strong&gt; para agendar tarefas periódicas. Ele é o "velho padrão de guerra", mas, apesar de funcional, o Cron possui algumas limitações — ou "manias" — que podem complicar sistemas modernos.&lt;/p&gt;

&lt;p&gt;Neste artigo, vamos explorar por que o &lt;strong&gt;systemd timers&lt;/strong&gt; é uma alternativa superior e como você pode portar seus scripts de forma simples.&lt;/p&gt;

&lt;h2&gt;
  
  
  O Problema com o Cron
&lt;/h2&gt;

&lt;p&gt;O Cron não é um padrão unificado. Dependendo da sua distribuição, você pode estar lidando com o Cron tradicional, anacron, fcron ou jobber, e cada um se comporta de maneira ligeiramente diferente. Além disso, gerenciar logs e falhas no Cron geralmente envolve redirecionamentos manuais de saída (&lt;code&gt;&amp;gt;&amp;gt; /var/log/cron.log 2&amp;gt;&amp;amp;1&lt;/code&gt;), o que raramente é uma solução "limpa".&lt;/p&gt;

&lt;h2&gt;
  
  
  Por que migrar para systemd Timers?
&lt;/h2&gt;

&lt;p&gt;Diferente do Cron, os timers são &lt;strong&gt;unidades do systemd&lt;/strong&gt;. Isso significa que eles herdam todo o poder do ecossistema que já gerencia seus serviços.&lt;/p&gt;

&lt;h3&gt;
  
  
  Principais Benefícios:
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;  &lt;strong&gt;Logging Nativo:&lt;/strong&gt; Esqueça o redirecionamento manual. Tudo vai automaticamente para o &lt;strong&gt;journald&lt;/strong&gt;, com colunas de tempo e metadados já inclusos.&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;Dependências Inteligentes:&lt;/strong&gt; Você pode configurar uma tarefa para rodar apenas se outra unidade estiver ativa ou reagir a mudanças no hardware.&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;Controle de Recursos:&lt;/strong&gt; É fácil definir limites de CPU, memória (OOM score) e acesso à rede diretamente no arquivo de unidade.&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;Tratamento de Falhas:&lt;/strong&gt; Suporte nativo para &lt;code&gt;OnFailure&lt;/code&gt;, permitindo disparar alertas ou scripts de recuperação se algo der errado.&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;Execução Persistente:&lt;/strong&gt; Com &lt;code&gt;Persistent=true&lt;/code&gt;, se a máquina estava desligada no horário agendado, o job roda assim que ela voltar a ligar — comportamento parecido com o do anacron, mas nativo. É o argumento decisivo para quem usa laptop ou VPS que não fica ligado 24/7.
## Mão na Massa: Portando um Cron Job&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;No Cron, o agendamento e a ação ficam na mesma linha. O systemd divide isso em dois arquivos: um arquivo de &lt;strong&gt;serviço&lt;/strong&gt; e um arquivo de &lt;strong&gt;timer&lt;/strong&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  1. O Script (A Ação)
&lt;/h3&gt;

&lt;p&gt;Crie um script em &lt;code&gt;/usr/local/bin/meu-script.sh&lt;/code&gt; e torne-o executável:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;sudo chmod&lt;/span&gt; +x /usr/local/bin/meu-script.sh
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  2. O Arquivo de Serviço (&lt;code&gt;.service&lt;/code&gt;)
&lt;/h3&gt;

&lt;p&gt;Crie este arquivo em &lt;code&gt;/etc/systemd/system/meu-script.service&lt;/code&gt;. Ele define &lt;strong&gt;o que&lt;/strong&gt; rodar.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight ini"&gt;&lt;code&gt;&lt;span class="nn"&gt;[Unit]&lt;/span&gt;
&lt;span class="py"&gt;Description&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;Meu Script de Automação&lt;/span&gt;

&lt;span class="nn"&gt;[Service]&lt;/span&gt;
&lt;span class="py"&gt;Type&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;oneshot&lt;/span&gt;
&lt;span class="py"&gt;ExecStart&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;/usr/local/bin/meu-script.sh&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Repare no &lt;code&gt;Type=oneshot&lt;/code&gt;. Para um script que roda, faz o seu trabalho e termina (o caso típico de um cron job), esse é o tipo correto. O padrão é &lt;code&gt;Type=simple&lt;/code&gt;, que funciona, mas considera o serviço "ativo" enquanto o processo estiver vivo — o que atrapalha a leitura de status e as dependências para tarefas de execução curta.&lt;/p&gt;

&lt;h3&gt;
  
  
  3. O Arquivo de Timer (&lt;code&gt;.timer&lt;/code&gt;)
&lt;/h3&gt;

&lt;p&gt;Crie este arquivo em &lt;code&gt;/etc/systemd/system/meu-script.timer&lt;/code&gt;. Ele define &lt;strong&gt;quando&lt;/strong&gt; o serviço será disparado.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight ini"&gt;&lt;code&gt;&lt;span class="nn"&gt;[Unit]&lt;/span&gt;
&lt;span class="py"&gt;Description&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;Agenda a execução do meu script&lt;/span&gt;

&lt;span class="nn"&gt;[Timer]&lt;/span&gt;
&lt;span class="py"&gt;OnCalendar&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;daily&lt;/span&gt;
&lt;span class="py"&gt;Persistent&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;true&lt;/span&gt;
&lt;span class="py"&gt;RandomizedDelaySec&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;300&lt;/span&gt;
&lt;span class="py"&gt;Unit&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;meu-script.service&lt;/span&gt;

&lt;span class="nn"&gt;[Install]&lt;/span&gt;
&lt;span class="py"&gt;WantedBy&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;timers.target&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;  &lt;strong&gt;OnCalendar:&lt;/strong&gt; Define o agendamento. Aqui, &lt;code&gt;daily&lt;/code&gt; equivale a todo dia à meia-noite. Você pode ser mais explícito, como &lt;code&gt;*-*-* 03:00:00&lt;/code&gt; para rodar às 3h da manhã.&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;Persistent:&lt;/strong&gt; Recupera execuções perdidas enquanto a máquina esteve desligada.&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;RandomizedDelaySec:&lt;/strong&gt; Espalha a execução dentro de uma janela aleatória (aqui, até 5 minutos). É o jeito certo de evitar que vários timers disparem exatamente no mesmo segundo e sobrecarreguem o sistema.
&amp;gt; &lt;strong&gt;Curiosidade:&lt;/strong&gt; ao contrário do Cron, o &lt;code&gt;OnCalendar&lt;/code&gt; aceita granularidade abaixo de um minuto. Algo como &lt;code&gt;OnCalendar=*:*:0/30&lt;/code&gt; dispara a cada 30 segundos — uma coisa que o Cron tradicional simplesmente não faz.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Como Ativar e Testar
&lt;/h2&gt;

&lt;p&gt;Após criar os arquivos, você precisa notificar o systemd:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt; &lt;strong&gt;Recarregar o daemon:&lt;/strong&gt; &lt;code&gt;sudo systemctl daemon-reload&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt; &lt;strong&gt;Habilitar e iniciar de uma vez:&lt;/strong&gt; &lt;code&gt;sudo systemctl enable --now meu-script.timer&lt;/code&gt;.
&amp;gt; &lt;strong&gt;Atenção:&lt;/strong&gt; você habilita e inicia o &lt;strong&gt;&lt;code&gt;.timer&lt;/code&gt;&lt;/strong&gt;, nunca o &lt;code&gt;.service&lt;/code&gt;. É o timer que controla quando o serviço será disparado.&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  Ferramenta Bônus: &lt;code&gt;systemd-analyze&lt;/code&gt;
&lt;/h3&gt;

&lt;p&gt;Você pode testar seus formatos de tempo antes de salvar:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;systemd-analyze calendar &lt;span class="s2"&gt;"daily"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Isso mostrará exatamente os próximos horários em que seu script será disparado, eliminando o "adivinho" do Cron.&lt;/p&gt;

&lt;h2&gt;
  
  
  Monitorando Logs
&lt;/h2&gt;

&lt;p&gt;Para acompanhar a execução em tempo real, use o comando:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;journalctl &lt;span class="nt"&gt;-fu&lt;/span&gt; meu-script.service
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Você também pode listar todos os timers ativos e ver quando cada um vai disparar a próxima vez:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;systemctl list-timers
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Conclusão
&lt;/h2&gt;

&lt;p&gt;Embora exija dois arquivos em vez de uma linha, a granularidade e a segurança dos systemd timers compensam o esforço inicial. Recursos como persistência, controle de recursos e logging nativo fazem dele uma modernização essencial para qualquer fluxo de trabalho robusto no Linux.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Este artigo foi baseado em:&lt;/em&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  &lt;em&gt;&lt;a href="https://www.freedesktop.org/software/systemd/man/latest/systemd.timer.html" rel="noopener noreferrer"&gt;https://www.freedesktop.org/software/systemd/man/latest/systemd.timer.html&lt;/a&gt;&lt;/em&gt;
&lt;/li&gt;
&lt;li&gt;  &lt;em&gt;&lt;a href="https://trstringer.com/systemd-timer-vs-cronjob/" rel="noopener noreferrer"&gt;https://trstringer.com/systemd-timer-vs-cronjob/&lt;/a&gt;&lt;/em&gt;
&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>linux</category>
      <category>devops</category>
      <category>systemd</category>
      <category>automation</category>
    </item>
  </channel>
</rss>
