Home Comunidade Eventos YouTube Networks Desafios // produtos Academy News CTI | CVE Contato

04 - Comando systemctl (start, stop, enable, status, mask)

video explicativo
Video explicativoEspaco reservado para o video desta anotação — adicione video: https://youtu.be/... no frontmatter da nota.

O utilitário systemctl é a interface de linha de comando (CLI) central e primária para a inspeção, manipulação e controle do gerenciador de sistema e serviços systemd. No modelo do systemd, o binário /usr/bin/systemctl não executa diretamente as alterações no estado dos processos; ele atua estritamente como um cliente IPC (Inter-Process Communication).

Quando um administrador executa um comando como systemctl start nginx, o utilitário serializa a requisição e a envia através do barramento do sistema (D-Bus) para a interface org.freedesktop.systemd1.Manager exposta pelo PID 1. É o processo daemon raiz que valida os privilégios (via Polkit), processa a alteração no Grafo Acíclico Dirigido (DAG) em memória e executa as chamadas de sistema no kernel.

Este arquivo detalha os verbos operacionais fundamentais (start, stop, enable, disable, status, mask, unmask e reload), a mecânica de transição de estado na RAM versus persistência em disco, a análise das tabelas de saída do status e os códigos de retorno IPC.


1. O Ciclo de Vida Transitório vs. Persistente

A arquitetura do systemd estabelece uma separação rígida entre a execução em tempo de execução (runtime state) e a configuração de inicialização em disco (boot configuration). Compreender a diferença entre alterar a memória e alterar o sistema de arquivos é o pilar para a administração do PID 1.

                      +----------------------------------+
                      |         Comandos IPC             |
                      |   (systemctl start / stop)       |
                      +----------------------------------+
                                       │
                                       ▼
                       ┌───────────────────────────────┐
                       │  Memória RAM (PID 1 - DAG)    │
                       │  Objeto da Unidade no Cgroup  │
                       └───────────────────────────────┘
                                       ▲
                                       │
                      +----------------------------------+
                      |       Links Simbólicos em Disco  |
                      |   (systemctl enable / disable)   |
                      +----------------------------------+

  • Estado Transitório (RAM): Manipulado por verbos como start, stop, restart e reload. Estas operações instruem o PID 1 a alterar imediatamente o estado da unidade na memória (criando cgroups, invocando execve(), ou enviando sinais de interrupção como SIGTERM). Se o sistema for reiniciado, o estado na RAM é perdido.
  • Estado Persistente (Disco): Manipulado por verbos como enable, disable, mask e unmask. Estas operações não afetam os processos em execução no momento presente. Elas modificam exclusivamente a presença de links simbólicos nos diretórios de alvo em /etc/systemd/system/*.wants/ ou /etc/systemd/system/*.requires/, ditando se a unidade será puxada para a transação do DAG durante o próximo ciclo de boot.

2. Invocação e Parada do Ciclo de Vida: start, stop, restart, reload

Os verbos de controle de execução gerenciam as transições de estado do objeto da unidade na memória e a correspondente árvore de processos nos Control Groups (cgroups).

2.1. systemctl start <unidade>

Solicita ao PID 1 que mova a unidade do estado inactive para o estado activating e, subsequentemente, active.

  • Mecânica Interna: O systemd analisa as dependências declaradas na unidade (Requires=, Wants=, After=). Ele enfileira um job na fila de transações. Se a unidade depender de outras unidades que ainda não estão ativas, o PID 1 resolverá e disparará as dependências primeiro.
  • Sincronismo: Por padrão, o systemctl start bloqueia o terminal até que o PID 1 confirme a conclusão da transação da unidade (por exemplo, quando um serviço Type=notify emite o sinal READY=1 via soquete Unix, ou quando um serviço Type=oneshot finaliza com código de saída 0).
  • Flag --no-block: Altera a chamada para assíncrona. O comando enfileira a requisição no D-Bus, retorna o controle ao shell imediatamente e permite que a inicialização ocorra em segundo plano.

2.2. systemctl stop <unidade>

Solicita a transição da unidade do estado active para deactivating e inactive.

  • Mecânica Interna: O systemd não se baseia na leitura de arquivos PID armazenados no disco para localizar os processos a serem encerrados. Ele identifica o cgroup exclusivo atrelado à unidade (ex: /sys/fs/cgroup/system.slice/nginx.service/).
  • Se a unidade definir a diretiva ExecStop=, esse comando é executado primeiro. Se não for definida, ou após a conclusão de ExecStop=, o PID 1 envia o sinal SIGTERM (ou o sinal definido em KillSignal=) para todos os processos pertencentes àquele cgroup simultaneamente.
  • Temporizador de Extermínio (TimeoutStopSec=): O systemd inicia uma contagem regressiva (padrão de 90 segundos). Se algum processo no cgroup recusar-se a finalizar e permanecer ativo após o estouro do temporizador, o PID 1 envia um sinal SIGKILL destrutivo e não interceptável para garantir a limpeza do cgroup.

2.3. systemctl restart <unidade>

Executa uma operação combinada e atômica de stop seguida de start.

  • Se a unidade estiver inativa no momento da chamada, o systemctl restart executará o start normalmente.
  • Durante o restart, o systemd cancela qualquer temporizador de restauração pendente e reconstrói as estruturas do objeto em memória, relendo atualizações feitas em disco caso os arquivos de unidade tenham sofrido alterações (se acoplado a um daemon-reload).

2.4. systemctl reload <unidade>

Solicita à aplicação que recarregue suas configurações em disco sem encerrar o processo nem perder descritores de arquivos abertos ou conexões de soquete ativas.

  • Mecânica Interna: O systemd lê a instrução definida na diretiva ExecReload= do arquivo .service (ex: ExecReload=/bin/kill -HUP $MAINPID ou /usr/sbin/nginx -s reload).
  • Se a unidade não possuir a diretiva ExecReload= declarada em seu arquivo de configuração, a requisição D-Bus falha e o systemctl retorna a mensagem de erro: Unit does not support reload.

3. Ancoragem e Persistência: enable, disable, is-enabled

Os verbos de habilitação manipulam a presença estrutural de links simbólicos no sistema de arquivos estático, determinando o comportamento do sistema durante a fase de montagem do DAG no boot.

3.1. systemctl enable <unidade>

Lê a seção [Install] do arquivo de unidade e cria os symlinks correspondentes nos diretórios de alvos (targets).

  • Mecânica de Disco: Se o arquivo /usr/lib/systemd/system/sshd.service contém:
[Install]
WantedBy=multi-user.target
Alias=sshd.service

Ao executar systemctl enable sshd.service, o systemctl imprime na saída padrão as operações de sistema de arquivos realizadas:
Created symlink /etc/systemd/system/multi-user.target.wants/sshd.service → /usr/lib/systemd/system/sshd.service.
* Combinação --now: Por padrão, enable não inicia o serviço imediatamente. Para habilitar a persistência no boot e iniciar o processo na RAM na mesma chamada, utiliza-se o atalho sintático:

systemctl enable --now sshd.service

3.2. systemctl disable <unidade>

Remove os links simbólicos associados à seção [Install] da unidade localizados em /etc/systemd/system/.

  • Mecânica de Disco: Remove o symlink em /etc/systemd/system/multi-user.target.wants/sshd.service.
  • Inércia de Runtime: Executar systemctl disable não para um serviço que esteja rodando na RAM. O processo continuará ativo até que um systemctl stop seja executado ou a máquina seja desenergizada.
  • Combinação --now: Desabilita a inicialização no boot e encerra a unidade na RAM simultaneamente:
systemctl disable --now sshd.service

3.3. systemctl is-enabled <unidade>

Interroga o sistema de arquivos e o estado da unidade, retornando uma string de status e um código de saída do shell ($?):

Saída da CLI Significado Arquitetural Código de Saída ($?)
enabled Symlink presente em /etc/systemd/system/*.wants/ ou .requires/. 0
disabled Symlink ausente nos alvos, mas a seção [Install] existe. non-zero (1)
static O arquivo de unidade não possui a seção [Install]. Não pode ser habilitado isoladamente; só é iniciado se requisitado por outra unidade. 0
masked A unidade aponta para /dev/null. non-zero (1)
indirect A unidade é habilitada exclusivamente por intermédio da diretiva Also= de outra unidade. 0
generated A unidade foi gerada dinamicamente na RAM por um generator executado no boot (ex: de /etc/fstab). 0
transient A unidade foi criada dinamicamente via API em tempo de execução (ex: systemd-run). 0

4. Diagnóstico e Inspeção de Estado: status

O comando systemctl status <unidade> é a ferramenta de diagnóstico primária para inspecionar a árvore de processos, os metadados de execução, o estado no cgroup e os últimos eventos do journald atrelados a uma unidade.

Anatômica Analítica da Saída do systemctl status

Considere a saída típica do comando systemctl status nginx.service:

● nginx.service - The NGINX HTTP and reverse proxy server
     Loaded: loaded (/usr/lib/systemd/system/nginx.service; enabled; vendor preset: enabled)
     Active: active (running) since Wed 2026-10-14 14:20:00 -03; 1h 32min ago
   Main PID: 2450 (nginx)
      Tasks: 3 (limit: 4915)
     Memory: 12.4M (max: 512.0M limit: 1.0G)
        CPU: 1.120s
     CGroup: /system.slice/nginx.service
             ├─2450 "nginx: master process /usr/sbin/nginx -g daemon off;"
             ├─2451 "nginx: worker process"
             └─2452 "nginx: worker process"

Oct 14 14:20:00 server01 systemd[1]: Starting The NGINX HTTP and reverse proxy server...
Oct 14 14:20:00 server01 systemd[1]: Started The NGINX HTTP and reverse proxy server.

Dissecação dos Campos de Diagnóstico:

  1. Linha de Cabeçalho (●): O símbolo indica a saúde visual da unidade. O ponto branco/verde indica operação normal; um ponto vermelho (●) indica que a unidade está no estado failed.
  2. Loaded::
    * loaded: O arquivo de unidade foi parseado e carregado na memória do PID 1.
    * /usr/lib/systemd/system/nginx.service: O caminho absoluto de onde o arquivo foi lido.
    * enabled: O estado de habilitação em disco.
    * vendor preset: enabled: A política padrão definida pelos empacotadores da distribuição.

  3. Active:: Exibe o estado da máquina de estados primária e sub-estado de runtime.
    * active (running): O processo principal está rodando e saudável.
    * active (exited): Típico de unidades Type=oneshot. O processo finalizou com sucesso (código 0) e a flag RemainAfterExit=yes mantém o estado como ativo.
    * failed (Result: exit-code): O processo crashou ou retornou código de erro não tratado.
    * since ...: O carimbo de data/hora relativo e absoluto do momento exato da última transição de estado.

  4. Main PID:: O Identificador de Processo (PID) do processo pai no espaço do kernel e o nome do binário.

  5. Tasks:: O número atual de threads e processos filhos alocados no cgroup, seguido pelo limite estipulado (TasksMax=).
  6. Memory:: O consumo de memória RAM física (RES) em tempo real, acompanhado pelas cotas de controle de recursos configuradas na unidade (MemoryMax=, MemoryHigh=).
  7. CPU:: O tempo total de CPU (user + system) consumido por todos os processos daquela unidade desde a sua inicialização.
  8. CGroup:: A hierarquia completa do Control Group (cgroup v2). Lista todos os PIDs pertencentes àquela unidade, provando a incapacidade de subprocessos "escaparem" do rastreamento do systemd.
  9. Roda de Logs (Journal Tail): Os últimos 10 registros de log coletados pelo systemd-journald filtrados estritamente para essa unidade (_SYSTEMD_UNIT=nginx.service).

5. Aniquilação Estrutural e Bloqueio: mask e unmask

Em sistemas complexos, simplesmente desabilitar uma unidade (systemctl disable) não impede que ela seja iniciada. Se a Unidade A estiver desabilitada, mas a Unidade B (que possui Requires=A ou Wants=A) for iniciada, o systemd tentará localizar o arquivo da Unidade A em disco e a disparará para satisfazer a dependência de B.

Para impor a neutralização absoluta de uma unidade, utiliza-se o mecanismo de Mascaramento (Masking).

                     /etc/systemd/system/servico.service
                                      │
                                      ▼ (Link Simbólico)
                                 /dev/null
                                      │
                                      ▼
             [Tentativa de Carga pelo Parser do PID 1]
                                      │
                                      ▼
             Retorno EOF -> Estado: "masked" (Falha Transacional)

5.1. systemctl mask <unidade>

Impede a execução da unidade sob qualquer circunstância (manual ou via dependência).

  • Mecânica do Sistema de Arquivos: O systemctl cria um link simbólico no diretório de mais alta prioridade do caminho de carga (/etc/systemd/system/) apontando diretamente para o dispositivo nulo do kernel (/dev/null):
# Operação executada pelo mask:
ln -s /dev/null /etc/systemd/system/nginx.service

  • Resultado Operacional: Quando o PID 1 tenta ler a unidade (seja por requisição manual systemctl start, ativação por soquete, ou por dependência Requires=), o parser encontra o arquivo vazio em /dev/null. A carga aborta imediatamente com a mensagem:
    Failed to start nginx.service: Unit nginx.service is masked.

5.2. systemctl unmask <unidade>

Remove o symlink que aponta para /dev/null em /etc/systemd/system/, restaurando a visibilidade do arquivo de unidade original mantido pelo fornecedor em /usr/lib/systemd/system/.

  • Mecânica de Disco:
# Operação executada pelo unmask:
rm /etc/systemd/system/nginx.service

  • Após o unmask, a unidade retorna ao seu estado prévio de habilitação (enabled ou disabled).

6. Recarga da Máquina de Estados e daemon-reload

Quando um administrador de sistemas cria um novo arquivo .service ou edita um arquivo existente em /etc/systemd/system/ (ou adiciona um arquivo drop-in em um diretório .service.d/), o systemd não detecta as alterações no disco automaticamente em tempo real.

O PID 1 mantém o grafo do sistema e todas as definições de unidades compiladas dentro da sua memória RAM.

01. systemctl daemon-reload

Instrui o PID 1 a re-varrer exaustivamente todo o caminho de carga de unidades (Unit Load Path):

  1. /etc/systemd/system/
  2. /run/systemd/system/
  3. /usr/lib/systemd/system/

O daemon-reload recompila os arquivos INI alterados em disco, atualiza os objetos na memória RAM, invalida caches obsoletos e reconstrói as arestas do Grafo Acíclico Dirigido (DAG).

  • Se um arquivo de unidade em disco for alterado e o administrador tentar executar systemctl start ou restart sem antes executar a recarga, o systemctl emitirá o aviso de alerta:
    Warning: The unit file, source configuration file or drop-ins of nginx.service changed on disk. Run 'systemctl daemon-reload' to reload units.

7. Matriz Operacional de Subcomandos do systemctl

A tabela abaixo resume a taxonomia de comandos do systemctl, destacando o domínio de alteração (RAM vs. Disco) e o efeito sistêmico correspondente:

Subcomando Domínio primário Altera estado na RAM imediato? Altera persistência no Boot? Efeito na Estrutura do Sistema de Arquivos
start Memória RAM Sim Não Nenhum. Executa a transação no DAG e cria cgroups.
stop Memória RAM Sim Não Nenhum. Envia sinais de terminação ao cgroup.
restart Memória RAM Sim Não Nenhum. Recria o cgroup e reinicia o processo.
reload Memória RAM Sim Não Nenhum. Envia sinal de recarga de config ao processo.
enable Disco Não Sim Cria symlink em /etc/systemd/system/*.wants/.
disable Disco Não Sim Remove symlink em /etc/systemd/system/*.wants/.
enable --now RAM + Disco Sim Sim Cria symlink e inicia o processo na memória.
disable --now RAM + Disco Sim Sim Remove symlink e encerra o processo na memória.
mask Disco Não Sim Cria symlink apontando a unidade para /dev/null.
unmask Disco Não Sim Deleta o symlink que apontava para /dev/null.
status Consulta (RAM) Não Não Leitura de telemetria no D-Bus e no Journald.
daemon-reload Memória RAM Sim Não Re-escaneia diretórios e atualiza o DAG na RAM.