Truques para gerenciar serviços com systemd no Linux

O systemd é o sistema de init e gerenciador de serviços padrão na maioria das distribuições Linux modernas. Dominar seus comandos e configurações é essencial para administradores de sistemas que precisam manter serviços rodando de forma confiável e eficiente. Este artigo apresenta truques práticos para gerenciar serviços com systemd, desde operações básicas até técnicas avançadas de isolamento e debugging.

1. Comandos essenciais para controle de serviços

O comando systemctl é a ferramenta central para gerenciar serviços. Para iniciar, parar, reiniciar e recarregar serviços, utilize:

# Iniciar um serviço
systemctl start nginx

# Parar um serviço
systemctl stop nginx

# Reiniciar um serviço
systemctl restart nginx

# Recarregar configuração sem interromper o serviço
systemctl reload nginx

Para controlar a inicialização automática:

# Habilitar serviço na inicialização
systemctl enable nginx

# Desabilitar serviço na inicialização
systemctl disable nginx

# Verificar status detalhado
systemctl status nginx

# Visualizar logs específicos do serviço
journalctl -u nginx -n 50 --no-pager

O comando journalctl é particularmente útil para diagnosticar problemas, pois centraliza logs de todos os serviços gerenciados pelo systemd.

2. Criando e editando unit files personalizados

Um unit file .service segue uma estrutura padronizada com três seções principais. Exemplo de um serviço simples para um script Python:

[Unit]
Description=Meu Serviço Personalizado
Documentation=https://exemplo.com/docs
After=network.target

[Service]
Type=simple
User=appuser
WorkingDirectory=/opt/meuapp
ExecStart=/usr/bin/python3 /opt/meuapp/app.py
ExecStop=/usr/bin/kill -SIGTERM $MAINPID
Restart=on-failure
RestartSec=5
Environment=PYTHONUNBUFFERED=1

[Install]
WantedBy=multi-user.target

Para criar e ativar o serviço:

# Salvar o arquivo em /etc/systemd/system/meuapp.service
# Recarregar o daemon
systemctl daemon-reload

# Iniciar e habilitar
systemctl start meuapp
systemctl enable meuapp

Diretivas importantes incluem Restart=always para reinicialização automática, User para executar como usuário específico e WorkingDirectory para definir o diretório de trabalho.

3. Gerenciando dependências e ordem de inicialização

O systemd permite definir dependências entre serviços usando as diretivas Requires, Wants e After. Exemplo de um serviço que depende de rede e banco de dados:

[Unit]
Description=Aplicação Web
Requires=network.target postgresql.service
Wants=redis.service
After=network.target postgresql.service
Before=nginx.service

[Service]
ExecStart=/usr/local/bin/webapp
Restart=always

[Install]
WantedBy=multi-user.target
  • Requires: serviço só inicia se as dependências estiverem ativas
  • Wants: tenta iniciar dependências, mas não falha se não conseguir
  • After: define ordem de inicialização (não cria dependência)
  • Before: garante que este serviço inicie antes de outro

4. Truques com temporizadores (timers) no systemd

Timers substituem cron jobs com vantagens como logs centralizados e integração com o systemd. Exemplo de timer para backup diário:

Arquivo /etc/systemd/system/backup.service:

[Unit]
Description=Backup diário do banco

[Service]
Type=oneshot
ExecStart=/usr/local/bin/backup.sh
User=backup

Arquivo /etc/systemd/system/backup.timer:

[Unit]
Description=Timer para backup diário

[Timer]
OnCalendar=daily
Persistent=true
RandomizedDelaySec=1800

[Install]
WantedBy=timers.target

Para executar em horários específicos:

[Timer]
OnCalendar=Mon..Fri 02:00:00

Ative o timer com:

systemctl enable backup.timer
systemctl start backup.timer

Vantagens dos timers: logs unificados no journalctl, suporte a calendário flexível, persistência de execuções perdidas e integração com dependências do systemd.

5. Limitando recursos e isolando serviços

Para ambientes multi-tenant ou de produção, limitar recursos é crucial. Exemplo de serviço web com restrições:

[Service]
ExecStart=/usr/sbin/nginx
CPUQuota=50%
MemoryMax=512M
IOWeight=100
TasksMax=200

# Isolamento
PrivateTmp=true
ProtectSystem=full
ProtectHome=true
NoNewPrivileges=true
ReadOnlyPaths=/
ReadWritePaths=/var/log/nginx /var/www
  • CPUQuota: limita uso de CPU (50% = meio core)
  • MemoryMax: limite de memória RAM
  • PrivateTmp: cria /tmp isolado para o serviço
  • ProtectSystem: torna diretórios do sistema somente leitura
  • NoNewPrivileges: impede escalonamento de privilégios

6. Debug e troubleshooting de serviços problemáticos

Quando um serviço falha, use estas técnicas:

# Listar serviços com falha
systemctl status --failed

# Últimas 100 linhas de log do serviço
journalctl -u nginx -n 100 --no-pager

# Logs em tempo real
journalctl -u nginx -f

# Logs desde a última inicialização
journalctl -u nginx --since today

# Forçar reinicialização automática
# No unit file:
Restart=always
RestartSec=10
StartLimitInterval=0  # Sem limite de tentativas

# Verificar sintaxe do unit file
systemd-analyze verify /etc/systemd/system/meuapp.service

Para debugging avançado:

# Verificar dependências
systemctl list-dependencies nginx

# Analisar tempo de inicialização
systemd-analyze blame

# Testar serviço sem iniciar
systemd-analyze verify /etc/systemd/system/meuapp.service

7. Automatizando manutenção com targets e snapshots

Targets agrupam serviços para iniciar em conjunto. Para criar um target personalizado:

Arquivo /etc/systemd/system/meuapp.target:

[Unit]
Description=Target para aplicação completa
Requires=multi-user.target
After=multi-user.target
AllowIsolate=yes

Configure serviços para pertencerem ao target:

[Install]
WantedBy=meuapp.target

Snapshots salvam o estado atual dos serviços:

# Criar snapshot antes de atualização
systemctl snapshot pre-update

# Restaurar estado anterior
systemctl isolate pre-update

# Listar snapshots
systemctl list-snapshots

Snapshots são ideais para rollback rápido após atualizações problemáticas.

Dominar esses truques com systemd permite gerenciar serviços Linux de forma profissional, garantindo disponibilidade, segurança e performance. Pratique cada técnica em ambiente de teste antes de aplicar em produção.

Referências