O systemd é o sistema de inicialização (init) e gerenciador de serviços padrão das principais distribuições Linux modernas. Ele gerencia tanto o processo de boot quanto a execução de serviços em segundo plano, oferecendo uma forma padronizada de configurar, habilitar, desabilitar e monitorar daemons. Neste artigo, veremos como criar, habilitar e depurar unidades de serviço, além de exemplos práticos de timers e sockets.
1. Conceitos Básicos
- Unit: Arquivo de configuração que descreve um recurso gerenciado pelo systemd (serviço, mount point, timer, socket etc.).
- Service Unit (
*.service
): Define como iniciar/stopar/recuperar um daemon. - Timer Unit (
*.timer
): Agenda a ativação periódica ou pontual de uma unit, geralmente uma service unit. - Socket Unit (
*.socket
): Cria sockets de escuta e aciona a service unit quando a conexão é recebida (activation on-demand).
Os arquivos de unit ficam em /etc/systemd/system/
(para administração local) ou /usr/lib/systemd/system/
(instalados por pacotes).
2. Criando uma Service Unit
Suponha que temos um script simples em /usr/local/bin/meu-servico.sh
:
#!/usr/bin/env bash
echo "$(date): Meu serviço está rodando!" >> /var/log/meu-servico.log
Dê permissão de execução:
sudo chmod +x /usr/local/bin/meu-servico.sh
Arquivo de Unit
Crie /etc/systemd/system/meu-servico.service
com o conteúdo:
[Unit]
Description=Meu Serviço de Exemplo
After=network.target
[Service]
Type=simple
ExecStart=/usr/local/bin/meu-servico.sh
Restart=on-failure
User=nobody
Group=nogroup
[Install]
WantedBy=multi-user.target
Description: descrição legível do serviço.
After: define dependência, aqui aguarda rede.
Type: simple
(starta o processo e considera “ativo” imediatamente).
ExecStart: comando de inicialização.
Restart: política de reinício.
User/Group: usuário sob o qual roda.
WantedBy: target no qual será habilitado.
3. Habilitando e Iniciando o Serviço
Após criar ou alterar a unit, recarregue o systemd:
sudo systemctl daemon-reload
Para iniciar imediatamente:
sudo systemctl start meu-servico.service
Para habilitar no boot:
sudo systemctl enable meu-servico.service
start
estop
controlam estado instantâneo.enable
edisable
controlam links simbólicos para targets de boot.
Verifique status:
sudo systemctl status meu-servico.service
4. Depurando Units
- Logs
Visualize logs viajournalctl
:
sudo journalctl -u meu-servico.service --since "1 hour ago"
Dry-run e Verificação de Sintaxe
systemd-analyze verify /etc/systemd/system/meu-servico.service
Modo Interativo
Para serviços do tipo simple
ou exec
, você pode rodar manualmente o ExecStart para capturar erros.
Verbose
Adicione --no-pager --lines=200
a journalctl
para mais contexto:
sudo journalctl -u meu-servico.service --no-pager --lines=200
5. Exemplos de Timers
Timers permitem substituir cron para jobs agendados:
Timer de 5 em 5 Minutos
- Service Unit (
/etc/systemd/system/backuptimer.service
):
[Unit]
Description=Backup periódico
[Service]
Type=oneshot
ExecStart=/usr/local/bin/backup.sh
Timer Unit (/etc/systemd/system/backuptimer.timer
):
[Unit]
Description=Agenda backup a cada 5 minutos
[Timer]
OnBootSec=2min
OnUnitActiveSec=5min
Persistent=true
[Install]
WantedBy=timers.target
Ative:
sudo systemctl daemon-reload
sudo systemctl enable --now backuptimer.timer
Verifique status:
systemctl list-timers backuptimer.timer
Timer Diário às 2h
[Timer]
OnCalendar=*-*-* 02:00:00
Persistent=true
6. Exemplos de Sockets
Sockets ativam serviços sob demanda, economizando recursos.
Echo Socket
- Socket Unit (
/etc/systemd/system/echo.socket
):
[Unit]
Description=Echo socket
[Socket]
ListenStream=12345
Accept=yes
[Install]
WantedBy=sockets.target
Service Unit Template (/etc/systemd/system/echo@.service
):
[Unit]
Description=Echo service for %i
[Service]
ExecStart=-/usr/bin/nc -l 12345 -c 'echo "Echo: $(cat)"'
StandardInput=socket
StandardOutput=socket
Ative:
sudo systemctl daemon-reload
sudo systemctl enable --now echo.socket
Teste:
nc localhost 12345
# Digite algo e receba de volta "Echo: <seu texto>"
7. Boas Práticas
- Isolar Serviços: use
User=
ePrivateTmp=yes
para isolamento. - Documentação: adicione
Documentation=
com links manuais. - Persistência:
Persistent=true
em timers registra execução mesmo se o sistema ficar desligado. - Template Units: use
@
para múltiplas instâncias de serviços.
Conclusão
O systemd oferece um framework poderoso e consistente para gerenciar serviços, agendamentos e sockets em Linux. A criação de unidades de serviço, timers e sockets é extremamente simples, bastando escrever arquivos .service
, .timer
ou .socket
e usar systemctl
para controlar tudo. Com as ferramentas de depuração (journalctl, systemd-analyze), você consegue diagnosticar e corrigir problemas rapidamente. Comece a experimentar hoje mesmo e torne sua administração de sistemas mais confiável e automatizada!