systemd
Gerenciar serviços
Seção intitulada “Gerenciar serviços”| Comando | O que faz |
|---|---|
systemctl status <unit> |
Estado, PID, últimas linhas de log |
systemctl start/stop/restart <unit> |
Controla a execução |
systemctl reload <unit> |
Recarrega config sem derrubar (se suportado) |
systemctl enable --now <unit> |
Habilita no boot e inicia agora |
systemctl disable --now <unit> |
Desabilita e para |
systemctl is-active <unit> / is-enabled |
Respostas para script |
systemctl list-units --type=service --state=running |
O que está rodando |
systemctl list-unit-files --state=enabled |
O que sobe no boot |
systemctl --failed |
O que falhou |
systemctl daemon-reload |
Recarrega definições após editar unit |
systemctl cat <unit> |
Mostra a unit efetiva, com overrides |
systemctl edit <unit> |
Cria override em /etc/systemd/system/<unit>.d/ |
systemctl show <unit> -p ExecStart |
Consulta propriedade específica |
Sempre daemon-reload depois de alterar arquivos de unit — sem isso, o systemd continua
com a definição antiga.
Escrever uma unit
Seção intitulada “Escrever uma unit”/etc/systemd/system/minha-api.service:
[Unit]Description=API da lojaAfter=network-online.targetWants=network-online.targetStartLimitIntervalSec=60StartLimitBurst=5
[Service]Type=simpleUser=appGroup=appWorkingDirectory=/opt/minha-apiEnvironmentFile=/etc/minha-api/envExecStart=/opt/minha-api/bin/apiExecReload=/bin/kill -HUP $MAINPIDRestart=on-failureRestartSec=5sTimeoutStopSec=30
# endurecimento — barato e eficazNoNewPrivileges=truePrivateTmp=trueProtectSystem=strictProtectHome=trueReadWritePaths=/var/lib/minha-apiCapabilityBoundingSet=
[Install]WantedBy=multi-user.targetType= |
Quando usar |
|---|---|
simple |
O processo não faz fork (padrão da maioria) |
exec |
Como simple, mas espera o exec ter sucesso |
forking |
O processo tradicional que faz fork e o pai sai |
oneshot |
Executa e termina (com RemainAfterExit=yes para “ficar ativo”) |
notify |
O serviço avisa o systemd quando está pronto |
Restart= |
Comportamento |
|---|---|
no |
Não reinicia (padrão) |
on-failure |
Reinicia em saída diferente de zero ou sinal — a escolha usual |
always |
Reinicia sempre, inclusive após parada limpa |
StartLimitBurst evita laço de reinício infinito consumindo o host.
Timers no lugar de cron
Seção intitulada “Timers no lugar de cron”/etc/systemd/system/backup.service e backup.timer:
# backup.service[Unit]Description=Backup diário
[Service]Type=oneshotExecStart=/usr/local/bin/backup.sh# backup.timer[Unit]Description=Executa o backup diariamente
[Timer]OnCalendar=*-*-* 02:30:00Persistent=true # executa se a máquina estava desligada na horaRandomizedDelaySec=300 # espalha a carga entre hostsAccuracySec=1min
[Install]WantedBy=timers.targetsystemctl enable --now backup.timersystemctl list-timers --all # próxima e última execuçãosystemd-analyze calendar "*-*-* 02:30:00" # valida a expressãosystemctl start backup.service # executa agora, para testarVantagens sobre o cron: log integrado ao journal, dependências, Persistent, jitter e
limite de recursos.
Logs com journalctl
Seção intitulada “Logs com journalctl”| Comando | O que faz |
|---|---|
journalctl -u <unit> -f |
Segue o log da unidade |
journalctl -u <unit> --since "1 hour ago" |
Janela de tempo |
journalctl -u <unit> -n 200 --no-pager |
Últimas linhas |
journalctl -p err -b |
Erros do boot atual |
journalctl -b -1 |
Boot anterior |
journalctl -k |
Mensagens do kernel |
journalctl -u <unit> -o json-pretty |
Saída estruturada |
journalctl _PID=1234 |
Por PID |
journalctl --disk-usage |
Espaço ocupado |
journalctl --vacuum-time=7d |
Limpa por idade |
journalctl --vacuum-size=500M |
Limpa por tamanho |
Dependências e ordem
Seção intitulada “Dependências e ordem”| Diretiva | Efeito |
|---|---|
After= / Before= |
Ordem de inicialização, não dependência |
Requires= |
Dependência forte: se falhar, esta unit falha |
Wants= |
Dependência fraca: tenta iniciar, tolera falha |
BindsTo= |
Para junto se a outra parar |
Conflicts= |
Não podem rodar juntas |
PartOf= |
Reinicia junto com a unidade pai |
systemctl list-dependencies <unit>systemd-analyze critical-chain <unit> # o que atrasa o bootsystemd-analyze blame # ranking de tempo de bootErro comum: usar After= achando que garante dependência. After só ordena; para exigir,
combine com Requires ou Wants.
Limites de recurso
Seção intitulada “Limites de recurso”[Service]MemoryMax=512MCPUQuota=50%TasksMax=100LimitNOFILE=65535systemd-cgtop mostra o consumo por unidade, agrupado por cgroup.
Pegadinhas
Seção intitulada “Pegadinhas”- Esquecer
daemon-reloadapós editar a unit. - Editar arquivo em
/lib/systemd/system/(é sobrescrito na atualização do pacote): usesystemctl editou/etc/systemd/system/. Restart=alwaysmascara um serviço que morre em laço — olhe o journal.Typeerrado faz o systemd achar que o serviço não subiu (ou que subiu antes da hora).EnvironmentFilenão interpreta shell: nada de$OUTRA_VARnem aspas com expansão.- Timer sem
Persistent=trueperde a execução se a máquina estiver desligada.