<?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: Lucas Riboli</title>
    <description>The latest articles on DEV Community by Lucas Riboli (@lucasriboli).</description>
    <link>https://dev.to/lucasriboli</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.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F1167818%2Fcaf09bdf-34b6-4d7e-9834-e423ffedfc19.jpeg</url>
      <title>DEV Community: Lucas Riboli</title>
      <link>https://dev.to/lucasriboli</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/lucasriboli"/>
    <language>en</language>
    <item>
      <title>Daemons: From Physics (?) to Linux System Control</title>
      <dc:creator>Lucas Riboli</dc:creator>
      <pubDate>Sat, 27 Sep 2025 23:21:30 +0000</pubDate>
      <link>https://dev.to/lucasriboli/daemons-from-physics-to-linux-system-control-34ke</link>
      <guid>https://dev.to/lucasriboli/daemons-from-physics-to-linux-system-control-34ke</guid>
      <description>&lt;p&gt;If there's one set of concepts and stories I've always liked, it's those related to &lt;strong&gt;physics, mythology, and computing&lt;/strong&gt;. While going about my business on the interwebs and in my daily work, I once stumbled upon &lt;strong&gt;DAEMONS&lt;/strong&gt;. Well, the name immediately grabs your attention, and in my opinion, the concept do too. So, let's take a closer look.&lt;/p&gt;

&lt;p&gt;In &lt;strong&gt;1871&lt;/strong&gt; (although he had cited it earlier in 1867), &lt;strong&gt;James Clerk Maxwell&lt;/strong&gt;, to explain the second law of thermodynamics, proposed a &lt;strong&gt;thought experiment&lt;/strong&gt; to refute it. He imagined a finite being, capable of manipulating molecules in a closed system, who observed and made decisions about opening or closing a door to allow the passage of fast molecules—basically, a being he considered impossible to exist. Later, &lt;strong&gt;Lord Kelvin&lt;/strong&gt; called this being a &lt;strong&gt;"daemon,"&lt;/strong&gt; not in the negative sense (he wasn't talking about a kid's backpack, 7-skins, or cold synthetic... This are brazilian ways to call the devil), but referring to a supernatural creature that &lt;strong&gt;works behind the scenes&lt;/strong&gt;, the concept of the &lt;strong&gt;daemon&lt;/strong&gt; from Greek mythology: invisible beings to humans, carrying out important tasks.&lt;/p&gt;

&lt;p&gt;This "daemon" concept is often associated with computing, although the link might not even exist, as, in the context of computers, the term has taken on its own specific technical meaning (but let's suppose the link exists; it makes everything cooler).&lt;/p&gt;

&lt;p&gt;But why would there be this connection?&lt;/p&gt;

&lt;p&gt;Well, the general idea is the same, but no longer as a thought experiment, but as something virtual. In operating systems, we have to keep the complex system under constant observation and action, without direct user intervention—that is, a true Greek &lt;strong&gt;daemon&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;And voilà, there we have it: &lt;strong&gt;Linux Daemons&lt;/strong&gt;. They remain in a state of &lt;strong&gt;slumber&lt;/strong&gt; (they aren't actually &lt;em&gt;off&lt;/em&gt;, but I'll explain this better later), being executed by a trigger, at regular intervals (usually seconds or milliseconds), or continuously processing queues. They exist for all types and functions, but the constant is: they operate &lt;strong&gt;autonomously&lt;/strong&gt;, without depending on user action, maintaining the operation of the operating system or managing functions that may eventually be used by interactive processes.&lt;/p&gt;

&lt;p&gt;One important example of a daemon management system, widely adopted in many modern distributions, is &lt;strong&gt;systemd&lt;/strong&gt;. It functions as a central manager: it starts and controls many other services, analyzing &lt;code&gt;.service&lt;/code&gt; files to determine the execution order, the location of the process binary, and how to manage its inputs and outputs.&lt;/p&gt;

&lt;p&gt;In practice, daemons are the &lt;strong&gt;foundation of Linux&lt;/strong&gt;, operating at various levels, from functions close to the hardware to user applications. Almost everything we use or see in our workflow has a daemon behind it. And the best part is, we can create our own daemons to execute tasks that don't require our direct attention, running in the background.&lt;/p&gt;

&lt;p&gt;Today, in many modern systems, &lt;strong&gt;systemd&lt;/strong&gt; is a widely used daemon manager, although alternatives like &lt;strong&gt;OpenRC, runit, and s6&lt;/strong&gt; have their own merits and proponents. With systemd, we can, for example, create a service that monitors hardware temperature and automatically generates logs, or run "one-shot" applications under its control, managing their execution, status, and eventual errors.&lt;/p&gt;

&lt;p&gt;Of course, there are many other daemons—as I said, they are everywhere, even where we might not expect (?). Take the &lt;strong&gt;Apache HTTP Server&lt;/strong&gt; (&lt;code&gt;httpd&lt;/code&gt;), a popular web server that operates as a daemon (I didn't know until I looked into it). There's also &lt;code&gt;crond&lt;/code&gt;, responsible for scheduled tasks present in &lt;strong&gt;cronjobs&lt;/strong&gt;, and this one has an interesting point: if we think about it directly, it executes tasks we create and ask to run at certain times or at regular intervals, and when they're not running, they are idle—very similar to daemons themselves!&lt;/p&gt;

&lt;p&gt;So, are my &lt;strong&gt;schedulers&lt;/strong&gt; daemons too? The line can be thin, as they share characteristics. The main difference is that many daemons are not actually "dormant"; they are actually assuming different &lt;strong&gt;"states."&lt;/strong&gt; (I said I'd mention this again)&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Interruptible Sleep (S):&lt;/strong&gt; In this state, they are actively executing, monitoring events, interfaces, or ports. For example, &lt;code&gt;sshd&lt;/code&gt; is always waiting for connections on port 22, or &lt;code&gt;cupsd&lt;/code&gt; is waiting for someone to send something for printing.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Uninterruptible Sleep (D):&lt;/strong&gt; In this state, it is waiting for an I/O operation to complete. For example, during a large file copy, &lt;code&gt;rsync&lt;/code&gt; might appear in state D.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;In other words, some use &lt;strong&gt;polling&lt;/strong&gt;, others operate based on &lt;strong&gt;system events or task queues&lt;/strong&gt;, etc. In fact, both daemons and schedulers can face delays due to system conditions, although daemons are typically designed to maximize efficiency and responsiveness.&lt;/p&gt;

&lt;p&gt;It's also interesting to know that there are several ways to create a daemon—some old and conventional, others modern and very resilient, or somewhere in between.&lt;/p&gt;

&lt;p&gt;A traditional way would be a script in &lt;code&gt;init.d&lt;/code&gt;, which is part of the &lt;strong&gt;SysV&lt;/strong&gt; initialization system. This model preceded systemd and was the standard in Linux distributions for many years. SysV init uses scripts in &lt;code&gt;/etc/init.d/&lt;/code&gt; to start, stop, and manage services in different &lt;strong&gt;runlevels&lt;/strong&gt;, offering a simpler but less parallelized system than systemd. This approach is still supported in many distributions for compatibility reasons.&lt;/p&gt;

&lt;p&gt;We can also create direct scripts with a loop or by observing queues &lt;strong&gt;without any control&lt;/strong&gt;—possibly the easiest way, but the most problematic: the application runs without any control, management, etc.&lt;/p&gt;

&lt;p&gt;But not everything is so black and white. Within the Linux community, there are those who see systemd as an &lt;strong&gt;unacceptable paradigm shift&lt;/strong&gt;. The Unix philosophy preaches to &lt;strong&gt;"Do One Thing and Do It Well."&lt;/strong&gt; Systemd does many things; for some, this is practical and a very favorable application design; for others, it's complexity and increased risk.&lt;/p&gt;




&lt;h2&gt;
  
  
  Hands On - Systemd
&lt;/h2&gt;




&lt;p&gt;Well, we've seen the theory, and although I find the idea very cool, let's move on to some practice now.&lt;/p&gt;

&lt;p&gt;I must warn you that I will only cover &lt;strong&gt;systemd&lt;/strong&gt; in this Hands-On; I have nothing against the other ways of creating a daemon, it's just for the practicality and visualization we'll have.&lt;/p&gt;

&lt;p&gt;Before getting our hands dirty and creating a daemon, let's analyze some existing ones within a small lab. So, let's go.&lt;/p&gt;

&lt;h3&gt;
  
  
  Lab:
&lt;/h3&gt;

&lt;h3&gt;
  
  
  Troubleshooting Laboratory with Systemd and Journal
&lt;/h3&gt;

&lt;p&gt;The idea in this lab is to practice how to create a daemon using systemd and perform troubleshooting using &lt;strong&gt;journalctl&lt;/strong&gt; and systemd itself.&lt;/p&gt;

&lt;h4&gt;
  
  
  Part 1:
&lt;/h4&gt;

&lt;h4&gt;
  
  
  1.
&lt;/h4&gt;

&lt;p&gt;Create a simple script that will serve as our service:&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 &lt;/span&gt;vi /usr/local/bin/my-service.sh
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;And inside the service, let's add a small loop made with bash:&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="c"&gt;#!/bin/bash&lt;/span&gt;
&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"Starting my-service"&lt;/span&gt;
logger &lt;span class="s2"&gt;"my-service started"&lt;/span&gt;
&lt;span class="nv"&gt;count&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;1
&lt;span class="k"&gt;while &lt;/span&gt;&lt;span class="nb"&gt;true&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;do
    &lt;/span&gt;&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"my-service is running: iteration &lt;/span&gt;&lt;span class="nv"&gt;$count&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;
    logger &lt;span class="s2"&gt;"my-service is running: check #&lt;/span&gt;&lt;span class="nv"&gt;$count&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;
    &lt;span class="nv"&gt;count&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="k"&gt;$((&lt;/span&gt;count+1&lt;span class="k"&gt;))&lt;/span&gt;
    &lt;span class="nb"&gt;sleep &lt;/span&gt;15
&lt;span class="k"&gt;done&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;NOTE&lt;/strong&gt;: Any content can be used, but you can use this if you want something ready.&lt;/p&gt;

&lt;h4&gt;
  
  
  2.
&lt;/h4&gt;

&lt;p&gt;Now let's allow this service to run:&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/my-service.sh
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h4&gt;
  
  
  3.
&lt;/h4&gt;

&lt;p&gt;Great, if everything is correct so far, now let's create a systemd config file for the service:&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 &lt;/span&gt;vi /etc/systemd/system/my-service.service
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Add the following content:&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;My test service&lt;/span&gt;
&lt;span class="py"&gt;After&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;network.target&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;simple&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/my-service.sh&lt;/span&gt;
&lt;span class="py"&gt;Restart&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;always&lt;/span&gt;
&lt;span class="py"&gt;RestartSec&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;5&lt;/span&gt;
&lt;span class="py"&gt;StandardOutput&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;journal&lt;/span&gt;
&lt;span class="py"&gt;StandardError&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;journal&lt;/span&gt;

&lt;span class="py"&gt;SyslogIdentifier&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;my-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;multi-user.target&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h4&gt;
  
  
  4.
&lt;/h4&gt;

&lt;p&gt;Okay, now let's start everything. To do this, follow these steps:&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 &lt;/span&gt;systemctl daemon-reload
&lt;span class="nb"&gt;sudo &lt;/span&gt;systemctl &lt;span class="nb"&gt;enable &lt;/span&gt;my-service.service
&lt;span class="nb"&gt;sudo &lt;/span&gt;systemctl start my-service.service
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h4&gt;
  
  
  5.
&lt;/h4&gt;

&lt;p&gt;To check if the service is running correctly, we can execute the following command:&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 &lt;/span&gt;systemctl status my-service.service
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;If you see it's &lt;strong&gt;running&lt;/strong&gt;, congratulations! We've successfully created our first daemon using systemd.&lt;/p&gt;

&lt;h4&gt;
  
  
  6.
&lt;/h4&gt;

&lt;p&gt;Now let's check the logs of our service:&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 &lt;/span&gt;journalctl &lt;span class="nt"&gt;-u&lt;/span&gt; my-service.service &lt;span class="nt"&gt;-f&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The &lt;code&gt;-f&lt;/code&gt; (follow) parameter shows the messages in real time.&lt;/p&gt;

&lt;h4&gt;
  
  
  Part 2:
&lt;/h4&gt;

&lt;p&gt;Ah, great, our daemon is running, everything is fine and peaceful. But it's time to break things...&lt;/p&gt;

&lt;p&gt;Let's break the service in various ways to practice troubleshooting.&lt;/p&gt;

&lt;h5&gt;
  
  
  Scenario 1: Corrupt the service script
&lt;/h5&gt;

&lt;p&gt;Let's access the script code again:&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 &lt;/span&gt;vi /usr/local/bin/my-service.sh
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Let's insert some syntax error:&lt;/p&gt;

&lt;p&gt;Restart the service:&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 &lt;/span&gt;systemctl restart my-service.service
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h5&gt;
  
  
  Scenario 2: Modify script permissions
&lt;/h5&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; &lt;span class="nt"&gt;-x&lt;/span&gt; /usr/local/bin/my-service.sh
&lt;span class="nb"&gt;sudo &lt;/span&gt;systemctl restart my-service.service
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h5&gt;
  
  
  Part 3:
&lt;/h5&gt;

&lt;p&gt;Now let's use the systemd and journal tools to diagnose the problems.&lt;/p&gt;

&lt;h5&gt;
  
  
  1. Check service status
&lt;/h5&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;sudo &lt;/span&gt;systemctl status my-service.service
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Observe the error codes, messages, and status.&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="c"&gt;# View all service logs&lt;/span&gt;
&lt;span class="nb"&gt;sudo &lt;/span&gt;journalctl &lt;span class="nt"&gt;-u&lt;/span&gt; my-service.service

&lt;span class="c"&gt;# View only error logs&lt;/span&gt;
&lt;span class="nb"&gt;sudo &lt;/span&gt;journalctl &lt;span class="nt"&gt;-u&lt;/span&gt; my-service.service &lt;span class="nt"&gt;-p&lt;/span&gt; err

&lt;span class="c"&gt;# View logs from a specific period&lt;/span&gt;
&lt;span class="nb"&gt;sudo &lt;/span&gt;journalctl &lt;span class="nt"&gt;-u&lt;/span&gt; my-service.service &lt;span class="nt"&gt;--since&lt;/span&gt; &lt;span class="s2"&gt;"10 minutes ago"&lt;/span&gt;

&lt;span class="c"&gt;# View logs from the current boot&lt;/span&gt;
&lt;span class="nb"&gt;sudo &lt;/span&gt;journalctl &lt;span class="nt"&gt;-u&lt;/span&gt; my-service.service &lt;span class="nt"&gt;-b&lt;/span&gt;

&lt;span class="c"&gt;# Check service dependencies&lt;/span&gt;
&lt;span class="nb"&gt;sudo &lt;/span&gt;systemctl list-dependencies my-service.service

&lt;span class="c"&gt;# Check service configuration&lt;/span&gt;
&lt;span class="nb"&gt;sudo &lt;/span&gt;systemctl &lt;span class="nb"&gt;cat &lt;/span&gt;my-service.service

&lt;span class="c"&gt;# Check processes&lt;/span&gt;
ps aux | &lt;span class="nb"&gt;grep &lt;/span&gt;my-service
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;All these commands will help you in troubleshooting. I recommend running them and seeing what each one does, trying to grasp every nuance. Now, try to find the errors within the logs, break it again (or more), correct them, and restart the daemon. In the end, that's the idea...&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Practice&lt;/strong&gt; so that if one day you have to create one and work on it, everything will be smooth.&lt;/p&gt;

</description>
      <category>linux</category>
    </item>
    <item>
      <title>Daemons Linux na Prática: Da Teoria ao Troubleshooting</title>
      <dc:creator>Lucas Riboli</dc:creator>
      <pubDate>Sun, 18 May 2025 14:21:30 +0000</pubDate>
      <link>https://dev.to/lucasriboli/daemons-linux-na-pratica-da-teoria-ao-troubleshooting-7jd</link>
      <guid>https://dev.to/lucasriboli/daemons-linux-na-pratica-da-teoria-ao-troubleshooting-7jd</guid>
      <description>&lt;h1&gt;
  
  
  Daemons: Da Física ao Controle de Sistemas Linux
&lt;/h1&gt;

&lt;p&gt;Em 1871, James Clerk Maxwell, para explicar a segunda lei da termodinâmica, propôs um experimento mental bastante curioso. Ele imaginou um ser finito, capaz de manipular moléculas em um sistema fechado, observando e tomando decisões sobre abrir ou fechar uma porta para permitir a passagem de moléculas rápidas. Mais tarde, Lord Kelvin chamou esse ser de "demônio", não no sentido de uma entidade maléfica, mas referindo-se a uma criatura sobrenatural que trabalha nos bastidores, como o conceito de &lt;em&gt;daemon&lt;/em&gt; na mitologia grega — seres invisíveis aos humanos, executando tarefas importantes.&lt;/p&gt;

&lt;p&gt;Esta analogia com o conceito de "daemon" é frequentemente citada em discussões sobre o termo em computação, embora a ligação histórica direta seja objeto de debate. No contexto dos computadores, o termo assumiu seu próprio significado técnico específico— mas vamos supor que seja verdade, deixa tudo mais legal —.&lt;br&gt;
Mas como essa ideia se aplica na prática?&lt;/p&gt;

&lt;p&gt;A ideia central permanece: agora, não mais como um experimento mental, mas como algo concreto. Nos sistemas operacionais, enfrentamos o desafio de manter um sistema complexo sob constante observação e ação, sem a intervenção direta do usuário — ou seja, um verdadeiro &lt;em&gt;daemon&lt;/em&gt; grego.&lt;/p&gt;

&lt;p&gt;Para isso, surgiram os processos que rodam em segundo plano, conhecidos como daemons. Eles permanecem em estado de dormência — ele nao fica de fato off, mas vou explicar melhor mais a frente — , sendo executados por algum gatilho, em intervalos regulares (geralmente segundos ou milissegundos), ou ainda processando filas continuamente. Existem de todos os tipos e funções, mas a constante é: eles operam de forma autônoma, sem depender da ação do usuário, mantendo o funcionamento do sistema operacional ou gerenciando funções que, eventualmente, podem ser usadas por processos interativos.&lt;/p&gt;

&lt;p&gt;Um exemplo importante de sistema de gerenciamento de daemons — e amplamente adotado em muitas distribuições modernas — é o &lt;strong&gt;systemd&lt;/strong&gt;. Ele funciona como um gerenciador central: inicia e controla muitos outros serviços, analisando arquivos &lt;code&gt;.service&lt;/code&gt; para determinar a ordem de execução, localização do binário do processo, e como gerenciar suas entradas e saídas.&lt;/p&gt;

&lt;p&gt;Na prática, daemons são a base do Linux, atuando em diversos níveis, desde funções próximas ao hardware até aplicações de usuário. Quase tudo o que usamos ou vemos em nosso workflow tem um daemon por trás. E o melhor: podemos criar nossos próprios daemons para executar tarefas que não requerem nossa atenção direta, funcionando em segundo plano.&lt;/p&gt;

&lt;p&gt;Hoje, em muitos sistemas modernos, o systemd é um gerenciador de daemons amplamente utilizado, embora existam alternativas como OpenRC, runit e s6 que têm seus próprios méritos e defensores. Com o systemd, podemos, por exemplo, criar um serviço que monitora a temperatura do hardware e gera logs automaticamente, ou executar aplicações "one shot" sob seu controle, gerenciando sua execução, status e eventuais erros.&lt;/p&gt;

&lt;p&gt;Claro, existem diversos outros daemons — como eu disse, eles estão por tudo e até onde a gente talvez (?) nem imagine — como o Apache HTTP Server (httpd), que é um servidor web popular que opera como daemon. Existe o crond, responsável pelas suas tarefas agendadas presentes nos cronjobs, e esse cara tem um ponto interessante, pois se pensarmos de uma forma direta, ele executa tarefas que criamos e pedimos para rodar em determinados momentos ou de tanto em tanto tempo e quando não rodam eles ficam parados, muito semelhante aos próprios daemons!&lt;/p&gt;

&lt;p&gt;Seriam meus schedulers daemons também? A linha pode ser tênue, pois compartilham características. A principal diferença é que muitos daemons não estão realmente "dormentes" como se poderia pensar - estão ativamente executando, monitorando eventos, interfaces ou portas, estão em Interruptible Sleep (S) ou Uninterruptible Sleep(D), sendo esperando algum evento e aguardando uma operação I/O ser concluída respectivamente. Alguns utilizam polling contínuo, outros operam baseados em eventos do sistema ou filas de tarefas. Na verdade, tanto daemons quanto schedulers podem enfrentar atrasos devido a condições do sistema, embora daemons sejam normalmente projetados para maximizar a eficiência e resposta.&lt;/p&gt;

&lt;p&gt;É interessante também saber que existem várias formas de criar um daemon, algumas antigas e usuais, outras modernas e muito resilientes, ou meio-termo.&lt;/p&gt;

&lt;p&gt;Uma forma tradicional seria um script no init.d, que faz parte do sistema de inicialização SysV. Este modelo precedeu o systemd e foi o padrão em distribuições Linux por muitos anos. O SysV init utiliza scripts em /etc/init.d/ para iniciar, parar e gerenciar serviços em diferentes runlevels, oferecendo um sistema mais simples mas menos paralelizado que o systemd. Essa abordagem ainda é suportada em muitas distribuições por razões de compatibilidade.&lt;/p&gt;

&lt;p&gt;Também podemos criar scripts diretos com loop ou observando filas sem nenhum controle, possivelmente a forma mais fácil mas a mais problemática: a aplicação sem nenhum controle, gerenciamento etc.&lt;/p&gt;

&lt;p&gt;Mas nem tudo é tão preto no branco assim, dentro da comunida Linux, há quem veja o systemd como um quebra de paradigmas inaceitavel. A filosofia Unix prega que "faça uma coisa e faça bem feito" ("Do One Thing and Do It Well"). O systemd faz muitas coisas, para alguns isso é praticidade e um design de aplicação muito favoravel para outros é complexidade e risco de mais. Ouve alguns posicionamentos de algumas figurinhas famosas na comunidade como o de Linus Torvalds que ve de forma neutra e até positiva.&lt;/p&gt;
&lt;h2&gt;
  
  
  Hands On - Systemd
&lt;/h2&gt;

&lt;p&gt;Mas não basta entender o conceito — como isso aparece no Linux real que usamos todos os dias? Vamos olhar um pouco para a prática.&lt;/p&gt;

&lt;p&gt;Fica aqui o alerta, que vou tratar apenas de systemd nesse hands On, nada contra as demais formas de criar um deamon, é apenas pela praticidade e visualização que teremos.&lt;/p&gt;

&lt;p&gt;Antes de colocar a mão na massa e criar algum deamon, vamos analisar alguns ja existentes dentro de um pequeno lab, entao bora lá.&lt;/p&gt;
&lt;h3&gt;
  
  
  Laboratório de Troubleshooting com Systemd e Journal
&lt;/h3&gt;

&lt;p&gt;A ideia nesse lab é a gente exercitar como seria criar um deamon usando o systemd e fazer troubleshooting usando journal e o proprio systemd&lt;/p&gt;
&lt;h4&gt;
  
  
  Parte 1: Criando um Serviço de Teste
&lt;/h4&gt;
&lt;h4&gt;
  
  
  1. Crie um script simples que servirá como nosso serviço
&lt;/h4&gt;


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

&lt;/div&gt;


&lt;p&gt;Adicione o seguinte conteúdo:&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="c"&gt;#!/bin/bash&lt;/span&gt;
&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"Iniciando meu-servico"&lt;/span&gt;
logger &lt;span class="s2"&gt;"meu-servico iniciado com sucesso"&lt;/span&gt;
&lt;span class="nv"&gt;count&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;1
&lt;span class="k"&gt;while &lt;/span&gt;&lt;span class="nb"&gt;true&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;do
    &lt;/span&gt;&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"meu-servico está funcionando: iteração &lt;/span&gt;&lt;span class="nv"&gt;$count&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;
    logger &lt;span class="s2"&gt;"meu-servico está rodando: verificação #&lt;/span&gt;&lt;span class="nv"&gt;$count&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;
    &lt;span class="nv"&gt;count&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="k"&gt;$((&lt;/span&gt;count+1&lt;span class="k"&gt;))&lt;/span&gt;
    &lt;span class="nb"&gt;sleep &lt;/span&gt;10
&lt;span class="k"&gt;done&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;OBS: pode ser qualquer conteudo mas caso queira algo pronto pode usar esse.&lt;/p&gt;

&lt;h4&gt;
  
  
  2. Torne o script executável
&lt;/h4&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-servico.sh
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h4&gt;
  
  
  3. Crie um arquivo de unidade systemd para o serviço
&lt;/h4&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;sudo &lt;/span&gt;nano /etc/systemd/system/meu-servico.service
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Adicione o seguinte conteúdo:&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 servico executando&lt;/span&gt;
&lt;span class="py"&gt;After&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;network.target&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;simple&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-servico.sh&lt;/span&gt;
&lt;span class="py"&gt;Restart&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;always&lt;/span&gt;
&lt;span class="py"&gt;RestartSec&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;5&lt;/span&gt;
&lt;span class="py"&gt;StandardOutput&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;journal&lt;/span&gt;
&lt;span class="py"&gt;StandardError&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;journal&lt;/span&gt;

&lt;span class="py"&gt;SyslogIdentifier&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;meu-servico&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;multi-user.target&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h4&gt;
  
  
  4. Recarregue a configuração do systemd, habilite e inicie o serviço
&lt;/h4&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;sudo &lt;/span&gt;systemctl daemon-reload
&lt;span class="nb"&gt;sudo &lt;/span&gt;systemctl &lt;span class="nb"&gt;enable &lt;/span&gt;meu-servico.service
&lt;span class="nb"&gt;sudo &lt;/span&gt;systemctl start meu-servico.service
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h4&gt;
  
  
  5. Verifique se o serviço está funcionando corretamente
&lt;/h4&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;sudo &lt;/span&gt;systemctl status meu-servico.service
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Observe o status (deve estar "active (running)") e as linhas de log recentes.&lt;/p&gt;

&lt;h4&gt;
  
  
  6. Verifique os logs do serviço
&lt;/h4&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;sudo &lt;/span&gt;journalctl &lt;span class="nt"&gt;-u&lt;/span&gt; meu-servico.service &lt;span class="nt"&gt;-f&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;O parâmetro &lt;code&gt;-f&lt;/code&gt; (follow) mostra as mensagens em tempo real.&lt;/p&gt;

&lt;h4&gt;
  
  
  Parte 2: Quebrando o Serviço Intencionalmente
&lt;/h4&gt;

&lt;p&gt;Agora vamos quebrar o serviço de várias maneiras para praticar diagnóstico.&lt;/p&gt;

&lt;h4&gt;
  
  
  Cenário 1: Corromper o script do serviço
&lt;/h4&gt;



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

&lt;/div&gt;



&lt;p&gt;Modifique o script inserindo um erro de sintaxe ou um comando inválido:&lt;/p&gt;

&lt;p&gt;Reinicie o serviço:&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 &lt;/span&gt;systemctl restart meu-servico.service
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h5&gt;
  
  
  Cenário 2: Modificar as permissões do script
&lt;/h5&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; &lt;span class="nt"&gt;-x&lt;/span&gt; /usr/local/bin/meu-servico.sh
&lt;span class="nb"&gt;sudo &lt;/span&gt;systemctl restart meu-servico.service
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h5&gt;
  
  
  Cenário 3: Dependência quebrada
&lt;/h5&gt;

&lt;p&gt;Modifique o arquivo de unidade do serviço para criar uma dependência inexistente:&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 &lt;/span&gt;nano /etc/systemd/system/meu-servico.service
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Adicione uma linha de dependência para um serviço inexistente:&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 Serviço de Exemplo&lt;/span&gt;
&lt;span class="py"&gt;After&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;network.target&lt;/span&gt;
&lt;span class="py"&gt;Requires&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;servico-inexistente.service&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Recarregue e tente reiniciar:&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 &lt;/span&gt;systemctl daemon-reload
&lt;span class="nb"&gt;sudo &lt;/span&gt;systemctl restart meu-servico.service
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h5&gt;
  
  
  Parte 3: Investigação e Diagnóstico
&lt;/h5&gt;

&lt;p&gt;Agora vamos usar as ferramentas do systemd e journal para diagnosticar os problemas.&lt;/p&gt;

&lt;h5&gt;
  
  
  1. Verificar status do serviço
&lt;/h5&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;sudo &lt;/span&gt;systemctl status meu-servico.service
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Observe os códigos de erro, mensagens e status.&lt;/p&gt;

&lt;h5&gt;
  
  
  2. Analisar logs do journal
&lt;/h5&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Ver todos os logs do serviço&lt;/span&gt;
&lt;span class="nb"&gt;sudo &lt;/span&gt;journalctl &lt;span class="nt"&gt;-u&lt;/span&gt; meu-servico.service

&lt;span class="c"&gt;# Ver apenas os logs de erro&lt;/span&gt;
&lt;span class="nb"&gt;sudo &lt;/span&gt;journalctl &lt;span class="nt"&gt;-u&lt;/span&gt; meu-servico.service &lt;span class="nt"&gt;-p&lt;/span&gt; err

&lt;span class="c"&gt;# Ver logs de um período específico&lt;/span&gt;
&lt;span class="nb"&gt;sudo &lt;/span&gt;journalctl &lt;span class="nt"&gt;-u&lt;/span&gt; meu-servico.service &lt;span class="nt"&gt;--since&lt;/span&gt; &lt;span class="s2"&gt;"10 minutes ago"&lt;/span&gt;

&lt;span class="c"&gt;# Ver logs do boot atual&lt;/span&gt;
&lt;span class="nb"&gt;sudo &lt;/span&gt;journalctl &lt;span class="nt"&gt;-u&lt;/span&gt; meu-servico.service &lt;span class="nt"&gt;-b&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h5&gt;
  
  
  3. Verificar dependências do serviço
&lt;/h5&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;sudo &lt;/span&gt;systemctl list-dependencies meu-servico.service
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h5&gt;
  
  
  4. Verificar configuração do serviço
&lt;/h5&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;sudo &lt;/span&gt;systemctl &lt;span class="nb"&gt;cat &lt;/span&gt;meu-servico.service
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h5&gt;
  
  
  5. Verificar processos
&lt;/h5&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;ps aux | &lt;span class="nb"&gt;grep &lt;/span&gt;meu-servico
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h5&gt;
  
  
  Parte 4: Corrigindo os Problemas
&lt;/h5&gt;

&lt;p&gt;Agora vamos corrigir os problemas que criamos:&lt;/p&gt;

&lt;h5&gt;
  
  
  Corrigir Cenário 1 (erro de sintaxe)
&lt;/h5&gt;



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

&lt;/div&gt;



&lt;p&gt;DEsfaca o erro de sintexe ou comando invalido&lt;/p&gt;

&lt;h5&gt;
  
  
  Corrigir Cenário 2 (permissões)
&lt;/h5&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-servico.sh
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h5&gt;
  
  
  Corrigir Cenário 3 (dependência quebrada)
&lt;/h5&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;sudo &lt;/span&gt;nano /etc/systemd/system/meu-servico.service
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Remova a linha &lt;code&gt;Requires=servico-inexistente.service&lt;/code&gt;.&lt;/p&gt;

&lt;h5&gt;
  
  
  Recarregar e reiniciar
&lt;/h5&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;sudo &lt;/span&gt;systemctl daemon-reload
&lt;span class="nb"&gt;sudo &lt;/span&gt;systemctl restart meu-servico.service
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



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

&lt;p&gt;Acredito que passamos por diversos pontos desde a história e alguns fundamentos dos deamons até o lab com um pouco de mão na massa. Por fim era isso; &lt;br&gt;
hehehehehe, thank you. - Resident Evil 4, Merchant&lt;/p&gt;

</description>
      <category>linux</category>
      <category>deamon</category>
      <category>programming</category>
      <category>devops</category>
    </item>
  </channel>
</rss>
