Systemd em Profundidade
Aula 2 de 7
Unit Files
Systemd gerencia serviços através de unit files. Cada serviço, socket, timer ou montagem é uma unit.
# Localização das units
ls /usr/lib/systemd/system/ # units fornecidas por pacotes
ls /etc/systemd/system/ # units personalizadas (sobrescreve)
Criando um Serviço Systemd
sudo tee /etc/systemd/system/meu-app.service << EOF
[Unit]
Description=Meu Serviço Personalizado
After=network.target
Wants=network-online.target
[Service]
Type=simple
User=meuuser
WorkingDirectory=/opt/meu-app
ExecStart=/usr/bin/python3 /opt/meu-app/app.py
Restart=on-failure
RestartSec=5
StandardOutput=journal
StandardError=journal
[Install]
WantedBy=multi-user.target
EOF
sudo systemctl daemon-reload
sudo systemctl enable --now meu-app
Tipos de Service
| Type | Comportamento |
|---|---|
| simple | Processo principal (não faz fork) |
| forking | Processo faz fork (daemon tradicional) |
| oneshot | Executa e termina (usado com RemainAfterExit=yes) |
| notify | Notifica via sd_notify() |
| dbus | Espera registro no D-Bus |
Timers — Substituindo Cron
sudo tee /etc/systemd/system/backup.timer << EOF
[Unit]
Description=Backup diário às 2h
[Timer]
OnCalendar=daily
OnCalendar=*-*-* 02:00:00
Persistent=true
RandomizedDelaySec=1800
[Install]
WantedBy=timers.target
EOF
sudo tee /etc/systemd/system/backup.service << EOF
[Unit]
Description=Script de backup
[Service]
Type=oneshot
ExecStart=/usr/local/bin/backup.sh
EOF
sudo systemctl enable --now backup.timer
systemctl list-timers
Journald — Gestão de Logs
# Configuração: /etc/systemd/journald.conf
journalctl -u nginx # logs de um serviço
journalctl --since "1 hour ago"
journalctl --until "2024-01-01"
journalctl -p err # apenas erros
journalctl -f # seguir em tempo real
journalctl --disk-usage # tamanho no disco
journalctl --vacuum-size=500M # limpar até 500MB
journalctl -o json-pretty # saída JSON
Cgroups e Resource Control
# Limitar recursos de um serviço
sudo mkdir -p /etc/systemd/system/meu-app.service.d/
sudo tee /etc/systemd/system/meu-app.service.d/limits.conf << EOF
[Service]
MemoryMax=500M
CPUQuota=50%
IOWeight=100
TasksMax=50
EOF
sudo systemctl daemon-reload
systemctl show meu-app -p MemoryMax
Systemd é o padrão no Linux moderno. Entender unit files, timers e journald é essencial para administração profissional.