Comando systemctl no Linux (gerenciador do systemd) [Guia Básico]

O comando systemctl no Linux é o gerenciador do Systemd, que é considerado o gerenciador de “quase tudo” no Linux.

O sistema systemd já é amplamente utilizado nas distribuições mais conhecidas, especialmente nas versões de Kernel superiores a 2.6. Dificilmente você irá encontrar uma distribuição moderna que não utilize o systemd.

Sua principal vantagem é a carga do sistema de forma mais rápida, executando os serviços e processos em paralelo. Isso foi possível com a chegada dos novos processadores dotados de múltiplos núcleos, que permitem a execução de diversas threads em paralelo.

Entre as novidades do systemd, estão:

  • Ativação via socket e bus (executa os serviços sob demanda);
  • Melhor paralelização dos processos;
  • Uso de cgroups (control groups – grupos de controle) ao invés de PIDS;
  • Suporta criação de imagens de estado de memória para salvar e restaurar estados de execução.

O sistema de controle de grupos permite que o systemd supervisione os processos, de forma a garantir que, quando um serviço é parado, todos os processos filhos, netos, bisnetos etc. também sejam parados.

Com um gerenciamento mais robusto, mais ciclos de CPU são necessários para a criação de novos processos. Mas devido ao alto desempenho dos processadores, isto não parece ser um problema para o systemd.

No systemd, a carga de processos, mudança de runlevel e scripts de carga são bem diferentes do init.

Para começar, o Systemd trata os Runlevens como Targets ou alvos. Cada Target pode ter várias Units. 

Entenda as Units como objetos que são lidos pelo Systemd. Esses objetos são arquivos de configuração que definem por exemplo:

  • Nome do objeto
  • Pré-requisitos para execução (se dependem de outras Units)
  • O que deve ser feito, por exemplo, rodar um determinado programa ou serviço
  • O que deve ser feito depois que o comando for iniciado.

Esses arquivos são bem abrangentes, e podem definir uma série de coisas dependendo do seu tipo. As Units mais comuns do Systemd são:

  • Tipo de serviço (service): usado para gerenciar um serviço ou aplicativo no servidor. Isso incluirá como iniciar ou interromper o serviço, sob quais circunstâncias ele deve ser iniciado automaticamente e as informações de dependência e pedido do software relacionado. São arquivos com extensão .service.
  • Tipo de ponto de montagem (mount): Esta unidade define um ponto de montagem no sistema a ser gerenciado pelo systemd. São arquivos com a extensão .mount
  • Tipo de tempo (timer): define que algo será gerenciado pelo systemd, semelhante a um trabalho cron, para ativação atrasada ou agendada.São arquivos com a extensão .timer 

Veja uma tabela comparativa de Runlevel (System V) e Targets do Systemd:

TABELA – Runlevels do Linux

RunlevelDescriçãoTarget
0O nível zero define um desligamento elegante e rápido do sistema.poweroff.target
1Manutenção do Sistemarescue.target
2Padrão multi-usuário modo textomulti-user.target
3Padrão multi-usuário modo textomulti-user.target
4Padrão multi-usuário modo textomulti-user.target
5Padrão multi-usuário modo gráficographical.target
6Reboot da máquina reboot.target

A sintaxe dos arquivos de configuração do Systemd, chamados de unidades, é inspirada nos arquivos .ini do Windows. Estes arquivos são encontrados em dois diretórios, a saber:

/usr/lib/systemd/system/: Unidades provenientes de pacotes de software instalados;

/etc/systemd/system/: Unidades instaladas pelo administrador;

Modo de Emergência e Resgate

Dois alvos especiais extra são resgate e emergência.

Rescue.target

O modo de resgate ou recuperação pode ser usando para uma manutenção do sistema mais “leve”. Neste modo o sistema:

  • Monta todos os sistemas de arquivos locais;
  • Somente o usuário root tem permissão para fazer login no sistema;
  • Os serviços de rede são desativados e apenas alguns outros serviços são iniciados;
  • O comando systemctl is-system-running retornará o status de manutenção.

Neste modo é possível executar utilitários de disco como o fsck ou xfs_repair para corrigir discos corrompidos. Este modo é util para corrigir também falhas nas configurações do sistema, ou de serviços.

Emergency.target

O target de Emergência é para uma manutenção pesada, quando muita coisa dá errado, geralmente com dados corrompidos. Neste modo o sistema:

  • Monta apenas o sistema de arquivos raiz como somente leitura;
  • Semelhante ao modo de recuperação, ele só permite que o usuário root faça login no sistema;
  • Os serviços de rede são desativados e apenas alguns outros serviços são iniciados;
  • O comando systemctl is-system-running retornará o status de manutenção.

Se o sistema entrar em modo de emergência sem dúvidas há sérios problemas. Este modo é usado para situações em que até mesmo o modo de resgate não funciona.

Comando systemctl

$ systemctl [opções] comando [nome]

O comando systemctl é quem comanda o show do sistema de gerenciamento de serviços do systemd. Os comandos possíveis são:

ComandoAção
list-unitsLista as units conhecidas
list-socketsLista as units do tipo socket
list-timersLista as units do tipo timer
start NOMEInicia uma ou mais units informadas em NOME
stop NOMEParauma ou mais units informadas em NOME
reload NOMERecarrega as configurações de uma ou mais units informadas
restart NOMEReiniciauma ou mais units informadas em NOME
try-restart NOMEReinicia as units se estiverem em execução. Faz nada se não estiverem rodando
isolate NOMEInicia todas as unidades especificadas e suas dependências, e para todas as outras. Usado para mudança de target
status [NOME]Mostra o status de uma unidade ou de todas se nada for especificado
show [NOME]Mostra as propriedades de uma ou mais unidades
cat NOMEMostra os arquivos de uma unidade
enable NOMEHabilita uma unidade para carga durante o boot. Não inicia uma unidade
disable NOMEDesabilita uma unidade para carga durante o boot. Não para a unidade
daemon-reloadReinicia o serviço do systemd.
mask NOMEColoca o serviço do limbo, impossibilitando a sua execução.
unmask NOMERetorna o serviço do limbo, possibilitando que seja iniciado.

Geralmente o desenvolvedor, não precisa saber criar, editar ou alterar qualquer unit. Basta saber listar as units, iniciar, parar, habilitar, desabilitar, ver o status e mudar de Runlevel.

Você pode ou não especificar a extensão das unidades (.target / .service / .timer) ao passar o comando. O systemctl sempre vai procurar por um padrão indicado no NOME.

Status no Systemctl

Desta forma, para verificar o serviço de cron (agendador) pode-se usar o comando status seguido do nome da unit cron com ou sem a extensão “.service“:

# systemctl status cron

Ou

# systemctl status cron.service
cron.service - Command Scheduler
               Loaded: loaded (/lib/systemd/system/cron.service; enabled)
               Active: active (running) since Mon, 28 May 2012 18:09:57
               Main PID: 673 (cron)
               CGroup: name=systemd:/system/cron.service
               + 673 /usr/sbin/cron -n

Parar um serviço com o systemctl

Para parar um serviço:

# systemctl stop cron.service

Veja o status do serviço quando parado:

# systemctl status cron.service
cron.service - Command Scheduler
               Loaded: loaded (/lib/systemd/system/cron.service; enabled)
               Active: inactive (dead) since Mon, 28 May 2012 18:18:26
               Main PID: 673 (code=exited, status=0/SUCCESS)
               CGroup: name=systemd:/system/cron.service

Iniciar um serviço com o systemctl

Para iniciar um serviço:

# systemctl start cron.service

Reiniciar um serviço com o systemctl

Para reiniciar um serviço:

# systemctl restart cron.service

Habilitar um serviço no boot com o systemctl

Para habilitar um serviço durante a carga do sistema, usa-se o comando enable:

# systemctl enable cron.service

Desabilitar um serviço com o systemctl

Para desabilitar um serviço durante a carga do sistema, usa-se o comando disable:

# systemctl disable cron.service

Mudar o runlevel com o systemctl

Para mudar o runlevel para o modo texto (runlevel 3), usa-se o comando isolate

# systemctl isolate multi-user.target

Para mudar o runlevel para o modo gráfico (runlevel 5):

# systemctl isolate graphical.target

Para ver qual o runlevel que está em execução, pode-se usar o comando get-default:

$ systemctl get-default
graphical.target

Alterar o runlevel padrão com o systemctl

Para alterar o runlevel padrão há duas maneiras:

A primeira é excluir e recriar o link simbólico manualmente:

a) Para excluir o link simbólico:

# rm /etc/systemd/system/default.target

b) Para colocar o runlevel3 como padrão, recriar o link simbólico:

# ln -sf /lib/systemd/system/multi-user.target /etc/systemd/system/default.target

A segunda maneira é usar o systemctl para fazer isso por você, com o comando set-default:

# systemctl set-default multi-user.target
Removed /etc/systemd/system/default.target.
Created symlink /etc/systemd/system/default.target -> /usr/lib/systemd/system/multi-user.target.

Para ver quais units um determinado serviço é dependente, pode-se usar o comando list-dependencies:

$ systemctl list-dependencies apache2
apache2.service
● ├─-.mount
● ├─system.slice
● └─sysinit.target
●   ├─apparmor.service
●   ├─dev-hugepages.mount
●   ├─dev-mqueue.mount
●   ├─keyboard-setup.service
●   ├─kmod-static-nodes.service
( ... )

É importante dizer que quando um determinado serviço é iniciado pelo systemd, o gerenciador iniciará também todas as dependências que aquele determinado serviço requer.

Por exemplo, se o serviço system.slice estiver parado e desabilitado, e o administrador iniciar o serviço do apache2, o serviço system.slice será iniciado, para que o serviço apache2 funcione corretamente.

Mascarar (mask) um serviço com systemctl

Para evitar que um serviço seja executado, mesmo que esteja desabilitado, e faça parte de dependência de alguma unit, o comando mask pode ser usado:

# systemctl mask apache2
Created symlink /etc/systemd/system/apache2.service → /dev/null.

Desta forma, o systemctl irá criar um link simbólico do serviço para o limbo /dev/null. Assim, o serviço não será iniciado de forma alguma, mesmo que seja dependência de outra unit:

# systemctl start apache2
Failed to start apache2.service: Unit apache2.service is masked.

Para voltar o serviço, o comando unmask pode executado, retornando a unidade do exílio:

# systemctl unmask apache2
Removed /etc/systemd/system/apache2.service.

Reiniciar o systemd com o systemctl

Toda a vez que for criada ou alterada alguma unit, é necessário reiniciar o serviço do Systemd com o comando daemon-reload:

# systemctl daemon-reload

O systemd mantém certa compatibilidade com o System V, através de um script que imita do comando service, que, na verdade, executa comandos do systemctl.

Desabilitando Serviços não Necessários

Uma importante tarefa do administrador é desabilitar os serviços desnecessários, especialmente serviços de rede.

O primeiro passo, é verificar quais serviços estão em execução com o comando:

$ systemctl status

Esse comando exibe uma lista de todos os serviços em execução.

Pode-se ainda listar as portas abertas e os seus respectivos processos com os comandos netstat ou ss:

# netstat -tunlp

ou

# ss -tunlp

Para desligar os serviços desnecessários, usa-se o comando:

# systemctl stop nomedoservico

E para desabilitar no processo de carga do sistema:

# systemctl disable nomedoservico

Se a distribuição ainda usa o System V Init Daemon, os serviços em execução podem ser vistos com o comando:

$ service --status-all

Ou com o comando:

$ chkconfig --list

Para parar os serviços, o comando pode ser utilizado:

# service nomedoservido stop

E para desabilitar:

# chkconfig nomedoservico off

Aprenda muito mais sobre Linux em nosso curso online. Você pode efetuar a matrícula aqui. Se você já tem uma conta, ou quer criar uma, basta entrar ou criar seu usuário aqui.

Gostou? Compartilhe