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
Runlevel | Descrição | Target |
0 | O nível zero define um desligamento elegante e rápido do sistema. | poweroff.target |
1 | Manutenção do Sistema | rescue.target |
2 | Padrão multi-usuário modo texto | multi-user.target |
3 | Padrão multi-usuário modo texto | multi-user.target |
4 | Padrão multi-usuário modo texto | multi-user.target |
5 | Padrão multi-usuário modo gráfico | graphical.target |
6 | Reboot 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:
Comando | Ação |
list-units | Lista as units conhecidas |
list-sockets | Lista as units do tipo socket |
list-timers | Lista as units do tipo timer |
start NOME | Inicia uma ou mais units informadas em NOME |
stop NOME | Parauma ou mais units informadas em NOME |
reload NOME | Recarrega as configurações de uma ou mais units informadas |
restart NOME | Reiniciauma ou mais units informadas em NOME |
try-restart NOME | Reinicia as units se estiverem em execução. Faz nada se não estiverem rodando |
isolate NOME | Inicia 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 NOME | Mostra os arquivos de uma unidade |
enable NOME | Habilita uma unidade para carga durante o boot. Não inicia uma unidade |
disable NOME | Desabilita uma unidade para carga durante o boot. Não para a unidade |
daemon-reload | Reinicia o serviço do systemd. |
mask NOME | Coloca o serviço do limbo, impossibilitando a sua execução. |
unmask NOME | Retorna 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
Tag:/dev, bash, certificação, certificaçãolinux, code, Comptia, developer, empreendedorismo, exame, freesoftware, gnu, hack, Linux, linuxfan, linuxfun, linuxmint, lovelinux, LPI, LPIC, management, nerd, opensource, php, prova, shell, software, softwarelivre, sql, tech, ti, unix