O systemd é o sistema init e gerenciador de serviços que alimenta virtualmente todas as distribuições Linux modernas, incluindo Ubuntu, Debian, Fedora, CentOS e Arch Linux. Ele substituiu o tradicional sistema SysVinit para fornecer inicialização paralela de serviços, gerenciamento de dependências, ativação sob demanda e registro centralizado. Seja gerenciando um único servidor ou uma frota de máquinas em produção, entender o systemd é essencial para a administração eficaz do Linux. Este guia cobre os comandos do systemctl, arquivos de unidade personalizados, temporizadores, gerenciamento do journal, análise de inicialização e controle de recursos com cgroups.

Pré-requisitos

Antes de começar, certifique-se de ter:

  • Ubuntu Server 20.04, 22.04 ou 24.04 (ou qualquer distribuição baseada em systemd)
  • Acesso ao terminal com privilégios sudo
  • Familiaridade básica com a linha de comando do Linux
  • Um editor de texto (nano, vim ou sua preferência)

O Que é o systemd?

O systemd é um gerenciador de sistema e serviços para Linux. Ele é executado como PID 1 — o primeiro processo iniciado pelo kernel — e é responsável por inicializar todo o espaço do usuário, gerenciar serviços durante todo seu ciclo de vida e desligar o sistema de forma limpa.

Os componentes principais do systemd incluem:

  • systemctl — a ferramenta principal de linha de comando para controlar serviços e inspecionar o estado do sistema
  • journald — um sistema de registro estruturado que coleta logs de todos os serviços, do kernel e da inicialização
  • systemd-analyze — uma ferramenta para análise e otimização do desempenho de inicialização
  • systemd-resolved — um serviço de resolução DNS
  • systemd-networkd — um gerenciador de configuração de rede
  • systemd-logind — um gerenciador de login e sessões
  • systemd-tmpfiles — uma ferramenta para gerenciar arquivos e diretórios temporários

Verifique se seu sistema executa o systemd:

systemctl --version

Saída esperada:

systemd 252 (252.22-1ubuntu1)
+PAM +AUDIT +SELINUX +APPARMOR +IMA +SMACK +SECCOMP +GCRYPT ...

Verifique o estado geral do sistema:

systemctl status

Isso mostra uma árvore de serviços em execução, seus PIDs e uso de memória.

systemd vs SysVinit

Entender o que mudou em relação ao SysVinit ajuda a esclarecer por que o systemd funciona da maneira que funciona:

CaracterísticaSysVinitsystemd
Definição de serviçoScripts shell em /etc/init.d/Arquivos de unidade declarativos em /etc/systemd/system/
Ordem de inicializaçãoSequencial (um após o outro)Paralelo (baseado em dependências)
Tratamento de dependênciasManual com scripts de runlevelAutomático com Requires, After, Wants
Rastreamento de processosArquivos PID (não confiável)cgroups (rastreamento no nível do kernel)
Registrosyslog / arquivos de log separadosjournald (journal binário estruturado)
Ativação sob demandaNão incorporadoAtivação por socket, ativação D-Bus
Controle de recursosNenhumcgroups (limites de CPU, memória, E/S)
Alvos de inicializaçãoRunlevels (0-6)Targets (multi-user.target, graphical.target)

A vantagem principal do systemd é a confiabilidade: ele rastreia processos via cgroups para sempre saber quais processos pertencem a um serviço, mesmo que façam fork. Os arquivos PID usados pelo SysVinit eram uma fonte comum de estado obsoleto e falhas no gerenciamento de serviços.

Gerenciamento de Serviços com systemctl

O systemctl é o comando que você usará com mais frequência. Ele se comunica com o gerenciador do systemd para controlar serviços, inspecionar seu status e gerenciar seu comportamento de inicialização.

Iniciar e Parar Serviços

# Iniciar um serviço
sudo systemctl start nginx

# Parar um serviço
sudo systemctl stop nginx

# Reiniciar um serviço (parar e depois iniciar)
sudo systemctl restart nginx

# Recarregar configuração sem reiniciar (se suportado)
sudo systemctl reload nginx

# Recarregar ou reiniciar (recarregar se suportado, caso contrário reiniciar)
sudo systemctl reload-or-restart nginx

Verificar o Status do Serviço

sudo systemctl status nginx

Exemplo de saída:

● nginx.service - A high performance web server and a reverse proxy server
     Loaded: loaded (/lib/systemd/system/nginx.service; enabled; vendor preset: enabled)
     Active: active (running) since Wed 2026-01-29 10:15:30 UTC; 2h ago
       Docs: man:nginx(8)
   Main PID: 1241 (nginx)
      Tasks: 3 (limit: 4647)
     Memory: 8.2M
        CPU: 52ms
     CGroup: /system.slice/nginx.service
             ├─1241 "nginx: master process /usr/sbin/nginx -g daemon on; master_process on;"
             ├─1242 "nginx: worker process"
             └─1243 "nginx: worker process"

Campos importantes:

  • Loaded — se o arquivo de unidade está carregado e onde está localizado
  • Active — o estado atual (active, inactive, failed)
  • Main PID — o identificador de processo principal do serviço
  • CGroup — todos os processos pertencentes a este serviço

Habilitar e Desabilitar Serviços

Habilitar um serviço significa que ele iniciará automaticamente na inicialização. Desabilitar remove esse comportamento.

# Habilitar um serviço para iniciar na inicialização
sudo systemctl enable nginx

# Desabilitar um serviço da inicialização automática
sudo systemctl disable nginx

# Habilitar e iniciar em um único comando
sudo systemctl enable --now nginx

# Desabilitar e parar em um único comando
sudo systemctl disable --now nginx

Verificar o Estado de Habilitação

systemctl is-enabled nginx
# Saída: enabled

systemctl is-active nginx
# Saída: active

systemctl is-failed nginx
# Saída: active (não falhou)

Listar Serviços

# Listar todos os serviços ativos
systemctl list-units --type=service

# Listar todos os serviços (incluindo inativos)
systemctl list-units --type=service --all

# Listar serviços habilitados
systemctl list-unit-files --type=service --state=enabled

# Listar serviços com falha
systemctl list-units --type=service --state=failed

Entendendo os Arquivos de Unidade

O systemd gerencia tudo através de arquivos de unidade — arquivos de configuração declarativos que descrevem serviços, pontos de montagem, dispositivos, sockets, temporizadores e mais.

Tipos de Unidade

Tipo de UnidadeExtensãoPropósito
Service.serviceGerencia um daemon ou processo de execução única
Timer.timerAgenda a ativação de serviços (substituto do cron)
Socket.socketGerencia a ativação baseada em sockets
Mount.mountGerencia pontos de montagem do sistema de arquivos
Target.targetAgrupa unidades para sincronização
Path.pathMonitora caminhos do sistema de arquivos para alterações
Slice.sliceGerencia partições de recursos de cgroups
Device.deviceGerencia nós de dispositivos do kernel

Localizações dos Arquivos de Unidade

Os arquivos de unidade são carregados de múltiplos diretórios com precedência específica:

DiretórioPropósitoPrioridade
/etc/systemd/system/Sobrescritas do administrador localMais alta
/run/systemd/system/Unidades de tempo de execução (não persistentes)Média
/lib/systemd/system/Unidades fornecidas pela distribuiçãoMais baixa

Sempre crie ou modifique unidades em /etc/systemd/system/. Nunca edite arquivos em /lib/systemd/system/ diretamente, pois as atualizações de pacotes irão sobrescrever suas alterações.

Inspecionar Arquivos de Unidade

# Ver o arquivo de unidade completo de um serviço
systemctl cat nginx.service

# Mostrar todas as propriedades de um serviço (configuração efetiva)
systemctl show nginx.service

# Mostrar uma propriedade específica
systemctl show nginx.service -p MainPID
systemctl show nginx.service -p ActiveState

# Listar todas as dependências de um serviço
systemctl list-dependencies nginx.service

Criando Unidades de Serviço Personalizadas

Uma das habilidades mais práticas do systemd é escrever seus próprios arquivos de unidade de serviço. Isso permite gerenciar qualquer aplicação — de um servidor Node.js a um binário Go ou um script Python — como um serviço do sistema.

Unidade de Serviço Básica

Crie um arquivo em /etc/systemd/system/myapp.service:

[Unit]
Description=My Custom Application
Documentation=https://example.com/docs
After=network.target
Wants=network-online.target

[Service]
Type=simple
User=myapp
Group=myapp
WorkingDirectory=/opt/myapp
ExecStart=/opt/myapp/bin/myapp --config /etc/myapp/config.yaml
Restart=on-failure
RestartSec=5
StandardOutput=journal
StandardError=journal
SyslogIdentifier=myapp

[Install]
WantedBy=multi-user.target

Detalhamento das Seções

[Unit] — metadados e dependências:

  • Description — descrição legível exibida na saída de status
  • Documentation — URL para documentação
  • After — iniciar esta unidade após as unidades listadas
  • Wants — dependência fraca (não falha se a dependência falhar)
  • Requires — dependência forte (falha se a dependência falhar)

[Service] — comportamento do serviço:

  • Type — como o systemd determina que o serviço está pronto (simple, forking, oneshot, notify, idle)
  • User / Group — executar o serviço como este usuário/grupo
  • WorkingDirectory — definir o diretório de trabalho
  • ExecStart — o comando para iniciar o serviço
  • ExecStartPre — comandos para executar antes do processo principal
  • ExecStartPost — comandos para executar após o processo principal iniciar
  • ExecStop — o comando para parar o serviço (padrão SIGTERM)
  • ExecReload — o comando para recarregar a configuração
  • Restart — quando reiniciar (no, on-success, on-failure, on-abnormal, on-watchdog, on-abort, always)
  • RestartSec — tempo de espera antes de reiniciar

[Install] — comportamento de instalação:

  • WantedBy — o target que deve incluir este serviço (geralmente multi-user.target)

Tipos de Serviço Explicados

# Simple (padrão): ExecStart é o processo principal
Type=simple

# Forking: o processo faz fork e o pai sai (daemons tradicionais)
Type=forking
PIDFile=/run/myapp.pid

# Oneshot: o processo executa até completar e depois sai
Type=oneshot
RemainAfterExit=yes

# Notify: o processo envia uma notificação quando está pronto
Type=notify

# Idle: como simple mas espera até que todos os trabalhos sejam despachados
Type=idle

Ativar o Serviço

Após criar ou modificar um arquivo de unidade, recarregue o daemon do systemd e gerencie o serviço:

# Recarregar o systemd para ler arquivos de unidade novos/modificados
sudo systemctl daemon-reload

# Iniciar o serviço
sudo systemctl start myapp

# Verificar o status
sudo systemctl status myapp

# Habilitar na inicialização
sudo systemctl enable myapp

Sobrescrever Unidades Existentes

Em vez de editar arquivos de unidade fornecidos pelo fornecedor, use sobrescritas drop-in:

# Criar um diretório e arquivo de sobrescrita
sudo systemctl edit nginx.service

Isso abre um editor para /etc/systemd/system/nginx.service.d/override.conf. Adicione apenas as diretivas que deseja alterar:

[Service]
LimitNOFILE=65535

Para ver a configuração efetiva após as sobrescritas:

systemctl cat nginx.service

Temporizadores do systemd

Os temporizadores do systemd são um substituto moderno para as tarefas cron. Eles oferecem agendamento persistente (recuperando execuções perdidas), registro por temporizador e integração com o controle de recursos de cgroups.

Estrutura da Unidade de Temporizador

Um temporizador requer dois arquivos: uma unidade .timer e uma unidade .service correspondente com o mesmo nome.

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

[Unit]
Description=Run backup every day at 2:00 AM

[Timer]
OnCalendar=*-*-* 02:00:00
Persistent=true
RandomizedDelaySec=300

[Install]
WantedBy=timers.target

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

[Unit]
Description=System Backup Service

[Service]
Type=oneshot
ExecStart=/usr/local/bin/backup.sh
User=root
StandardOutput=journal
StandardError=journal

Tipos de Temporizador

Baseados em calendário (OnCalendar):

# Todos os dias à meia-noite
OnCalendar=daily

# Todas as segundas-feiras às 3 da manhã
OnCalendar=Mon *-*-* 03:00:00

# A cada 6 horas
OnCalendar=*-*-* 00/6:00:00

# Primeiro dia de cada mês
OnCalendar=*-*-01 00:00:00

# A cada 15 minutos
OnCalendar=*-*-* *:00/15:00

Monotônicos (relativos a um evento):

# 5 minutos após a inicialização
OnBootSec=5min

# 1 hora após o temporizador ser ativado
OnActiveSec=1h

# 30 minutos após a última execução ser concluída
OnUnitActiveSec=30min

Gerenciar Temporizadores

# Recarregar, habilitar e iniciar o temporizador
sudo systemctl daemon-reload
sudo systemctl enable --now backup.timer

# Listar todos os temporizadores ativos
systemctl list-timers --all

# Verificar o status do temporizador
systemctl status backup.timer

# Testar o serviço associado manualmente
sudo systemctl start backup.service

Verificar Expressões de Calendário

Use systemd-analyze calendar para testar suas expressões de temporizador:

systemd-analyze calendar "Mon *-*-* 03:00:00"

Saída:

  Original form: Mon *-*-* 03:00:00
Normalized form: Mon *-*-* 03:00:00
    Next elapse: Mon 2026-02-02 03:00:00 UTC
       (in UTC): Mon 2026-02-02 03:00:00 UTC
       From now: 3 days left

Gerenciamento de Journal e Logs com journalctl

O journald é o componente de registro do systemd. Ele coleta logs de todos os serviços, do kernel e do processo de inicialização em um journal binário estruturado que suporta buscas rápidas, filtragem e exportação.

Uso Básico do journalctl

# Ver todos os logs (mais antigos primeiro)
journalctl

# Ver as entradas mais recentes (mais novas primeiro)
journalctl -r

# Seguir logs em tempo real
journalctl -f

# Mostrar logs desde a última inicialização
journalctl -b

# Mostrar logs da inicialização anterior
journalctl -b -1

Filtrar por Serviço

# Logs de um serviço específico
journalctl -u nginx.service

# Seguir um serviço específico em tempo real
journalctl -u nginx.service -f

# Logs de múltiplos serviços
journalctl -u nginx.service -u php-fpm.service

Filtrar por Tempo

# Logs desde um horário específico
journalctl --since "2026-01-29 10:00:00"

# Logs em um intervalo de tempo
journalctl --since "2026-01-29 10:00:00" --until "2026-01-29 12:00:00"

# Logs da última hora
journalctl --since "1 hour ago"

# Logs de hoje
journalctl --since today

Filtrar por Prioridade

O journalctl suporta níveis de prioridade do syslog:

# Mostrar apenas erros e acima
journalctl -p err

# Mostrar avisos e acima
journalctl -p warning

# Mostrar críticos e acima
journalctl -p crit
Nível de PrioridadePalavra-chaveNumérico
Emergênciaemerg0
Alertaalert1
Críticocrit2
Erroerr3
Avisowarning4
Notificaçãonotice5
Informaçãoinfo6
Depuraçãodebug7

Formatos de Saída

# Saída JSON (para processamento)
journalctl -u nginx.service -o json-pretty

# Saída curta com timestamps precisos
journalctl -u nginx.service -o short-precise

# Saída detalhada com todos os campos
journalctl -u nginx.service -o verbose

Gerenciar o Tamanho do Journal

# Verificar o uso atual de disco
journalctl --disk-usage

# Manter apenas as últimas 2 semanas de logs
sudo journalctl --vacuum-time=2weeks

# Limitar o tamanho do journal a 500 MB
sudo journalctl --vacuum-size=500M

# Remover journals arquivados
sudo journalctl --rotate
sudo journalctl --vacuum-time=1s

Para configuração persistente, edite /etc/systemd/journald.conf:

[Journal]
SystemMaxUse=500M
SystemMaxFileSize=50M
MaxRetentionSec=2week

Depois reinicie o journald:

sudo systemctl restart systemd-journald

Análise de Desempenho de Inicialização

O systemd fornece ferramentas integradas para medir e otimizar tempos de inicialização.

Tempo Total de Inicialização

systemd-analyze

Saída:

Startup finished in 3.245s (kernel) + 8.712s (userspace) = 11.957s
graphical.target reached after 8.510s in userspace.

Detalhamento por Serviço

# Listar serviços ordenados por tempo de inicialização
systemd-analyze blame

Saída:

5.012s NetworkManager-wait-online.service
1.234s snapd.service
  892ms docker.service
  456ms nginx.service
  234ms ssh.service
  ...

Cadeia Crítica

A cadeia crítica mostra a sequência de unidades que determinou o tempo total de inicialização:

systemd-analyze critical-chain

Saída:

graphical.target @8.510s
└─multi-user.target @8.508s
  └─nginx.service @8.052s +456ms
    └─network-online.target @8.050s
      └─NetworkManager-wait-online.service @3.038s +5.012s
        └─NetworkManager.service @2.890s +145ms
          └─basic.target @2.880s

Gráfico de Inicialização SVG

Gere uma linha do tempo visual do processo de inicialização:

systemd-analyze plot > boot-chart.svg

Abra o arquivo SVG em um navegador web para ver uma representação gráfica detalhada dos tempos de inicialização de serviços e dependências.

Identificar Serviços Lentos

# Encontrar serviços lentos para iniciar
systemd-analyze blame | head -20

# Verificar se um serviço específico atrasa a inicialização
systemd-analyze critical-chain nginx.service

Estratégias comuns de otimização de inicialização:

  • Desabilitar serviços que não são necessários (sudo systemctl disable nome_do_serviço)
  • Mascarar serviços que nunca devem ser executados (sudo systemctl mask nome_do_serviço)
  • Investigar o NetworkManager-wait-online.service (uma fonte comum de atraso na inicialização)
  • Usar ativação por socket para serviços que não são necessários imediatamente

Controle de Recursos com Cgroups

O systemd usa os grupos de controle do Linux (cgroups) para gerenciar e limitar os recursos disponíveis para cada serviço. Isso evita que um único serviço com mau comportamento consuma todos os recursos do sistema.

Ver o Uso Atual de Recursos

# Mostrar uso de recursos por slice
systemd-cgtop

Definir Limites de Memória

Adicione diretivas de recursos à seção [Service] de um arquivo de unidade:

[Service]
MemoryMax=512M
MemoryHigh=400M
  • MemoryMax — limite rígido; o OOM killer intervém se excedido
  • MemoryHigh — limite flexível; o kernel limita o serviço quando excedido

Definir Limites de CPU

[Service]
CPUQuota=50%
CPUWeight=100
  • CPUQuota — limita o serviço a uma porcentagem de um único núcleo de CPU (200% = dois núcleos)
  • CPUWeight — peso relativo para compartilhamento de tempo de CPU (padrão é 100)

Definir Limites de E/S

[Service]
IOWeight=50
IOReadBandwidthMax=/dev/sda 10M
IOWriteBandwidthMax=/dev/sda 5M

Aplicar Limites em Tempo de Execução

Você pode aplicar limites de recursos temporariamente sem modificar arquivos de unidade:

# Limitar memória para um serviço em execução
sudo systemctl set-property nginx.service MemoryMax=512M

# Limitar CPU para um serviço em execução
sudo systemctl set-property nginx.service CPUQuota=50%

# Tornar a alteração persistente
sudo systemctl set-property nginx.service MemoryMax=512M --runtime=false

Ver Limites Efetivos

systemctl show nginx.service -p MemoryMax -p CPUQuota -p IOWeight

Referência de Comandos systemctl

ComandoDescrição
systemctl start <unidade>Iniciar uma unidade
systemctl stop <unidade>Parar uma unidade
systemctl restart <unidade>Reiniciar uma unidade
systemctl reload <unidade>Recarregar configuração da unidade
systemctl enable <unidade>Habilitar unidade na inicialização
systemctl disable <unidade>Desabilitar unidade na inicialização
systemctl enable --now <unidade>Habilitar e iniciar imediatamente
systemctl status <unidade>Mostrar status da unidade
systemctl is-active <unidade>Verificar se a unidade está em execução
systemctl is-enabled <unidade>Verificar se a unidade está habilitada
systemctl is-failed <unidade>Verificar se a unidade falhou
systemctl list-unitsListar todas as unidades carregadas
systemctl list-unit-filesListar todos os arquivos de unidade
systemctl list-timersListar temporizadores ativos
systemctl daemon-reloadRecarregar alterações de arquivos de unidade
systemctl cat <unidade>Mostrar conteúdo do arquivo de unidade
systemctl show <unidade>Mostrar todas as propriedades da unidade
systemctl edit <unidade>Criar sobrescrita drop-in
systemctl mask <unidade>Impedir que a unidade inicie
systemctl unmask <unidade>Remover máscara da unidade
systemctl list-dependencies <unidade>Mostrar dependências da unidade
systemctl set-property <unidade> <chave>=<val>Definir propriedade em tempo de execução
journalctl -u <unidade>Ver logs da unidade
journalctl -u <unidade> -fSeguir logs da unidade
systemd-analyze blameMostrar tempo de inicialização por serviço
systemd-analyze critical-chainMostrar caminho crítico de inicialização

Solução de Problemas em Serviços com Falha

Quando um serviço falha, siga esta abordagem sistemática para diagnosticar e resolver o problema.

Passo 1: Verificar o Status

sudo systemctl status myapp.service

Procure a linha Active. Estados comuns:

  • active (running) — o serviço está funcionando normalmente
  • inactive (dead) — o serviço está parado
  • failed — o serviço parou inesperadamente ou falhou ao iniciar
  • activating (auto-restart) — o serviço está reiniciando

Passo 2: Ler os Logs

# Logs completos do serviço
journalctl -u myapp.service --no-pager

# Últimas 50 linhas
journalctl -u myapp.service -n 50

# Apenas erros
journalctl -u myapp.service -p err

Passo 3: Validar o Arquivo de Unidade

# Verificar erros de sintaxe
systemd-analyze verify /etc/systemd/system/myapp.service

Passo 4: Testar o Comando Manualmente

Execute o comando ExecStart manualmente como o usuário do serviço para verificar se a aplicação funciona:

sudo -u myapp /opt/myapp/bin/myapp --config /etc/myapp/config.yaml

Passo 5: Verificar Problemas Comuns

Erros de permissão:

# Verificar se o binário é executável
ls -la /opt/myapp/bin/myapp

# Verificar se o usuário existe
id myapp

# Verificar permissões do diretório
ls -la /opt/myapp/

Dependências ausentes:

# Verificar bibliotecas compartilhadas ausentes
ldd /opt/myapp/bin/myapp

Conflitos de porta:

# Verificar se a porta já está em uso
ss -tlnp | grep :8080

Passo 6: Redefinir um Serviço com Falha

# Redefinir o estado de falha
sudo systemctl reset-failed myapp.service

# Tentar iniciar novamente
sudo systemctl start myapp.service

Padrões de Erro Comuns

SintomaCausa ProvávelSolução
code=exited, status=203/EXECBinário não encontrado ou não executávelVerificar o caminho do ExecStart e permissões
code=exited, status=217/USERO usuário do serviço não existeCriar o usuário com useradd
code=exited, status=200/CHDIRWorkingDirectory não existeCriar o diretório
code=exited, status=1/FAILUREErro da aplicaçãoVerificar logs com journalctl
O serviço continua reiniciandoLoop de falhasVerificar RestartSec, revisar logs da aplicação
code=killed, signal=KILLOOM killerAumentar MemoryMax ou otimizar a aplicação

Resumo

O systemd é a base do gerenciamento de serviços em sistemas Linux modernos. Ele fornece uma abordagem unificada e declarativa para gerenciar serviços, agendar tarefas, controlar recursos e analisar o comportamento do sistema. Dominar o systemctl, os arquivos de unidade, os temporizadores e o journalctl oferece controle completo sobre como seus servidores Linux operam.

Pontos-chave:

  • Use o systemctl para todas as tarefas de gerenciamento de serviços: iniciar, parar, habilitar, desabilitar e verificar status
  • Escreva arquivos de unidade personalizados em /etc/systemd/system/ para gerenciar suas próprias aplicações como serviços do sistema
  • Substitua tarefas cron por temporizadores do systemd para agendamento persistente, registro por tarefa e controle de recursos
  • Use o journalctl para filtragem poderosa de logs por serviço, intervalo de tempo e nível de prioridade
  • Analise o desempenho de inicialização com systemd-analyze e desabilite serviços desnecessários para acelerar o boot
  • Aplique limites de recursos com cgroups (MemoryMax, CPUQuota) para evitar que serviços esgotem o sistema
  • Use sobrescritas drop-in (systemctl edit) em vez de modificar arquivos de unidade do fornecedor

Para uma abordagem mais ampla sobre a segurança dos seus servidores Linux, consulte nosso Checklist de Segurança para Servidores Linux e Guia de Configuração do Firewall UFW.