systemctl: gestão de serviços e unidades do systemd
No Linux, o systemctl desempenha um papel central na gestão do sistema init e do gestor de serviços systemd. Com o systemctl, os utilizadores têm controlo sobre os serviços, unidades e configurações do systemd, o que o torna uma ferramenta indispensável para a administração do sistema. Desde o controlo do arranque até à personalização dos estados do sistema, o systemctl oferece uma vasta gama de funcionalidades.
O que é o systemctl?
O systemctl é uma ferramenta de linha de comandos para gerir o systemd, um sistema de inicialização e gestor de sistemas para sistemas operativos Linux. O systemd é atualmente o sistema de inicialização padrão em muitas distribuições Linux ou distribuições Linux para servidores, como o Ubuntu, Debian, Fedora, Red Hat Enterprise Linux (RHEL), CentOS, Arch Linux, Mageia ou Gentoo, mas não está implementado de forma universal em todas as distribuições.
No ecossistema systemd, o systemctl desempenha um papel central na gestão dos serviços do sistema, na configuração, no comportamento de arranque e na manutenção do sistema. A funcionalidade da ferramenta vai além do simples arranque e paragem de serviços, oferecendo um controlo abrangente sobre quase todos os aspetos de um sistema Linux.
No tutorial a seguir, encontrará exemplos práticos de código e comandos do Linux para utilizar o systemctl com base no Ubuntu 22.04.
Gestão de serviços
O principal objetivo do sistema init é iniciar os componentes necessários após o arranque do kernel do Linux (componentes do «userland»). Além disso, o sistema init é utilizado para controlar eficazmente os serviços e os daemons num servidor, em qualquer momento durante a execução do sistema.
No systemd, a maioria dos processos centra-se nas conhecidas unidades; ou seja, recursos que são geridos pelo systemd. Estas unidades são classificadas de acordo com o tipo de recurso que representam e são definidas através dos chamados ficheiros de unidade. O tipo de unidade pode ser identificado pela extensão do ficheiro.
Ao gerir serviços, as unidades de serviço que terminam com o sufixo .service são particularmente importantes. No entanto, muitas vezes não é necessário especificar este sufixo nos comandos de gestão de serviços, uma vez que o systemd consegue reconhecer que esses comandos se referem, normalmente, a serviços.
Início e interrupção dos serviços
As tarefas mais comuns realizadas com o systemctl no Linux incluem iniciar e parar serviços. Estas funções são fundamentais para a gestão do sistema e permitem-lhe manter o controlo sobre os processos em execução no sistema. Para iniciar um serviço, utilize o comando «start». Se estiver a trabalhar como utilizador sem direitos de root, deve utilizar «sudo»:
$ sudo systemctl start application.servicebashComo o systemd foi concebido para procurar automaticamente ficheiros .service para comandos de gestão de serviços, o comando também pode ser introduzido de forma simplificada:
$ sudo systemctl start applicationbashPor exemplo, para iniciar o servidor web Apache, digite:
$ sudo systemctl start apache2bashSe quiseres parar um serviço em execução, usa o comando «stop»:
$ sudo systemctl stop application.servicebashReinício e recarga
Para reiniciar um serviço, o que normalmente é necessário após uma alteração na configuração, utilize o comando «restart»:
$ sudo systemctl restart application.servicebashSe a aplicação em questão for capaz de recarregar os seus ficheiros de configuração sem reiniciar, pode utilizar o comando «reload» para iniciar este processo:
$ sudo systemctl reload application.servicebashSe não tiver a certeza se um serviço oferece a opção de recarregar a sua configuração, pode utilizar o comando «reload-or-restart». A configuração será recarregada se essa opção for compatível. Caso contrário, o comando irá reiniciar o serviço para aplicar a configuração atualizada.
$ sudo systemctl reload-or-restart application.servicebashAtivação e desativação dos serviços
Ao ativar e desativar os serviços, pode especificar se estes devem ser iniciados automaticamente ou não ao arrancar o sistema. Isto é especialmente importante para o desempenho do sistema, a segurança e a gestão das dependências entre os diferentes serviços. Para configurar um serviço de modo a que seja executado automaticamente ao arrancar o sistema, utilize o comando «enable»:
$ sudo systemctl enable application.servicebashQuando este processo é executado, é criado um link simbólico. Este link liga a cópia do ficheiro de serviço do sistema, que normalmente se encontra em /lib/systemd/system ou /etc/systemd/system, ao diretório no disco rígido onde o systemd procura ficheiros para o arranque automático, o que normalmente ocorre em /etc/systemd/system/some_target.target.wants.
$ sudo systemctl enable application.servicebashPara impedir que um serviço seja iniciado automaticamente ao arrancar o sistema, utilize «disable»:
$ sudo systemctl disable application.servicebashIsto elimina o link simbólico que anteriormente especificava que o serviço deveria ser iniciado automaticamente. Atenção: a simples ativação de um serviço não o inicia imediatamente na sessão atual. Para iniciar o serviço imediatamente e configurá-lo para que seja iniciado automaticamente no arranque, deve executar os comandos «start» e «enable».
Verificação do estado dos serviços
Com o systemctl, é possível exibir informações detalhadas sobre o estado dos serviços. Esta função é especialmente útil para monitorizar e diagnosticar o estado atual dos serviços do sistema e das aplicações. Utilize o comando «status» para verificar:
$ systemctl status application.servicebashEste comando fornece uma vasta gama de informações, incluindo o estado atual do serviço (ativo, inativo, com falha, etc.), os processos e mensagens de registo executados mais recentemente, a hierarquia do cgroup e as primeiras linhas do registo.
Para verificar o estado atual de um serviço no Linux com o systemctl, utiliza-se o comando «is-active». Este comando indica se um serviço está atualmente ativo ou não:
$ systemctl is-active application.servicebashO estado atual é normalmente indicado como «ativo» se o serviço estiver ativo, ou «inativo» caso contrário.
Pode utilizar o comando «is-enabled» para verificar se um serviço está configurado para ser ativado automaticamente no arranque do sistema. Isto é especialmente útil para gerir as configurações de arranque dos serviços num sistema Linux.
$ systemctl is-enabled application.servicebashO comando indica se o serviço está ativado ou desativado e, consequentemente, define o código de saída como «0» ou «1», dependendo da resposta.
Também pode utilizar o comando «is-failed» para verificar se um serviço específico se encontra em estado de erro:
$ systemctl is-failed application.servicebashSe a execução for bem-sucedida, aparece «active»; se ocorrer um erro, aparece «failed». Se a unidade tiver sido parada intencionalmente, a resposta pode ser «unknown» ou «inactive». Um estado de saída «0» indica que ocorreu um erro, enquanto «1» indica qualquer outro estado.
Resumo através do estado do sistema
Os comandos apresentados até agora centram-se na gestão de serviços individuais, mas não oferecem uma visão geral do estado atual do sistema. No entanto, existe uma grande variedade de comandos do systemctl que fornecem este tipo de informação.
O «list-units» é uma ferramenta útil para obter uma visão geral das unidades atualmente disponíveis no Linux:
$ systemctl list-unitsbashQuando o comando é executado, o systemctl apresenta uma lista das unidades geridas pelo systemd. A apresentação desta lista inclui várias colunas com informações específicas sobre cada unidade. Essas colunas mostram o seguinte:
- UNIT: o nome da unidade, geralmente corresponde ao nome do ficheiro de configuração da unidade; por exemplo, sshd.service para os daemons SSH.
- LOAD: indica se um ficheiro da unidade foi carregado corretamente; os valores possíveis são «loaded», «not-found» ou «error».
- ACTIVE: o estado de atividade da unidade; pode assumir valores como «active», «inactive», «activating» ou «deactivating».
- SUB: o estado de atividade subordinado, que fornece detalhes sobre o estado da unidade; por exemplo, uma unidade «active» pode ter um estado SUB de «running», «exited» ou «failed».
- DESCRIPTION: uma breve descrição da unidade que geralmente reflete o objetivo ou a funcionalidade da unidade.
No entanto, por predefinição, o comando mostra apenas as unidades ativas, pelo que a coluna LOAD da saída costuma apresentar «loaded» e a coluna ACTIVE «active». Com opções adicionais, o systemctl pode ser configurado para apresentar também informações mais detalhadas. Por exemplo, para mostrar todas as unidades carregadas pelo systemd, independentemente do seu estado de atividade atual, utilize a opção «–all»:
$ systemctl list-units --allbashA saída pode ser ainda mais refinada utilizando indicadores adicionais, como «–state=», para filtrar estados específicos nas categorias LOAD, ACTIVE ou SUB. É importante manter o indicador «–all» para que também sejam apresentadas as unidades inativas:
$ systemctl list-units --all --state=inactivebashTambém pode utilizar o filtro «–type=» para mostrar apenas determinados tipos de unidades; por exemplo, para ver apenas as unidades em serviço ativo:
$ systemctl list-units --type=servicebashLista de todos os ficheiros da unidade
Para apresentar uma lista de todos os ficheiros de unidade no Linux com o systemctl (incluindo aqueles que o systemd não tentou carregar), pode utilizar o comando «list-unit-files». Este comando apresenta todos os ficheiros de unidade conhecidos pelo systemd, incluindo serviços, sockets, objetivos, etc.
$ systemctl list-units-filesbashO comando apresenta vários estados dos ficheiros das unidades. Estes estados indicam como as unidades correspondentes estão configuradas, nomeadamente no que diz respeito ao seu comportamento no arranque do sistema. Os estados mais comuns são:
- Ativado: a unidade está configurada para ser ativada automaticamente ao iniciar o sistema.
- Desativado: a unidade não está configurada para iniciar automaticamente durante o processo de arranque.
- Masked: a unidade está completamente desativada, pelo que não é possível iniciá-la nem manualmente nem automaticamente.
- Estática: a unidade não inicia de forma independente, mas depende normalmente de outra unidade e só inicia neste contexto
Gestão das unidades
A gestão das unidades é uma das principais funções do systemctl. Para obter informações mais específicas sobre unidades individuais e sobre como geri-las, o systemctl disponibiliza uma série de comandos e opções úteis.
Visualização de um ficheiro de unidade
Pode utilizar o comando «cat» para apresentar o conteúdo de um ficheiro de unidade específico diretamente no painel. Por exemplo, para ver o ficheiro de unidade de um serviço como o ssh.service, introduza:
$ systemctl cat ssh.servicebashVisualização de dependências
As dependências de uma unidade específica podem ser apresentadas numa estrutura em árvore utilizando o comando «list-dependencies». O comando tem o seguinte formato:
$ systemctl list-dependencies sshd.servicebashPor predefinição, as dependências são apresentadas para as unidades «.target» que representam diferentes estados do sistema. Para obter uma lista completa e recursiva de todas as dependências, utilize o parâmetro «–all».
Para mostrar as dependências inversas, ou seja, as unidades que dependem da unidade especificada, adicione «–reverse» ao comando. Além disso, os indicadores «–before» e «–after» permitem ver as dependências que começam antes ou depois da unidade em questão.
Ocultação e revelação de unidades
O mascaramento de uma unidade desativa-a, impedindo que seja iniciada manualmente ou automaticamente. Esta prática é frequentemente utilizada para garantir que os dependentes não iniciem acidentalmente ou automaticamente um serviço ou uma unidade. O mascaramento é realizado através da criação de um link simbólico do ficheiro da unidade em questão para «/dev/null» com o comando «mask»:
$ sudo systemctl mask nginx.servicebashIsto garante que o serviço Nginx não possa ser iniciado manualmente nem automaticamente enquanto estiver no modo de mascaramento.
O comando «unmask» desativa o estado de máscara de uma unidade, para que esta possa reiniciar normalmente. O comando para desativar a máscara é «unmask»:
$ sudo systemctl unmask nginx.servicebashEdição de ficheiros de unidade
O systemctl dispõe de opções para personalizar e modificar ficheiros de unidade. Esta funcionalidade foi introduzida na versão 218 do systemd. Se utilizar o comando «edit», abre-se automaticamente um ficheiro de unidade da unidade selecionada para edição:
$ sudo systemctl edit nginx.servicebashAo editar, é criado um ficheiro vazio para adicionar ou alterar instruções específicas à definição de uma unidade. Para cada unidade, por exemplo «nginx.service», é criada uma subpasta no diretório «/etc/systemd/system» com o nome do ficheiro seguido de «.d»; neste caso, «nginx.service.d».
O ficheiro «override.conf» é criado nesta subpasta. Quando o systemd carrega a unidade, combina o conteúdo deste ficheiro de snippet com o ficheiro de unidade original, pelo que as instruções do snippet têm prioridade. Para processar o ficheiro de unidade completo, pode utilizar o indicador «–full»:
$ sudo systemctl edit --full nginx.servicebashCom a opção «–full», o ficheiro da unidade existente é aberto num editor para que se possam efetuar alterações. Ao sair do editor, o sistema guarda o ficheiro editado em «/etc/systemd/system».
Para reverter as alterações que tenha feito, pode eliminar o diretório de configuração «.d» da unidade ou o ficheiro alterado em «/etc/systemd/system»:
$ sudo rm -r /etc/systemd/system/nginx.service.dbashUma imagem de unidade totalmente atualizada é apagada com o seguinte comando:
$ sudo rm /etc/systemd/system/nginx.servicebashDepois de eliminar o ficheiro ou a pasta, é necessário reiniciar o systemd para que este deixe de fazer referência aos ficheiros eliminados e, em vez disso, volte a utilizar a cópia do próprio sistema:
$ sudo systemctl daemon-reloadbashAdaptação do estado do sistema (Runlevel) com objetivos
Os alvos no systemd são utilizados principalmente para agrupar diferentes unidades com o objetivo de definir estados específicos do sistema (semelhante ao Runlevel noutros sistemas init). Os ficheiros com a extensão «.target» funcionam como pontos de referência que indicam o estado de disponibilidade de determinadas funcionalidades, permitindo que os utilizadores especifiquem o estado geral pretendido, em vez das unidades individuais necessárias.
Um exemplo prático é o «swap.target», que indica o estado de preparação para a troca. As unidades que participam no processo de troca podem sincronizar-se com este objetivo através de opções de configuração como «WantedBy=» ou «RequiredBy=». As unidades que dependem do swap, por sua vez, podem indicar isso através de ajustes como «Wants=», «Requires=» e «After=» para expressar a sua dependência e sequência de arranque em relação ao swap.
Recuperação e configuração da lente padrão
A recuperação e configuração do objetivo padrão permite definir um estado padrão do sistema que o seu sistema deve atingir no arranque. Veja como encontrar o objetivo padrão do seu sistema:
$ systemctl get-default
Output
multi-user.targetbashSe quiser alterar o destino padrão, utilize o comando «set-default» juntamente com o nome do destino. Utilize o seguinte comando para definir o destino padrão como «graphical.target», que inicia uma interface gráfica de utilizador:
$ sudo systemctl set-default graphical.targetbashLista dos objetivos disponíveis
Para listar todos os objetivos disponíveis no teu sistema, podes utilizar o seguinte comando:
$ systemctl list-unit-files --type=targetbashÉ apresentada uma lista de todos os ficheiros da unidade de destino instalados no sistema. Para cada destino, é apresentado o caminho e o estado atual (por exemplo, ativado ou desativado).
Isolamento de alvos
Com «isolate», podes ativar todas as unidades que estejam ligadas a um alvo específico e, ao mesmo tempo, parar todas as outras unidades que não estejam ligadas a ele.
Suponhamos que esteja a trabalhar num ambiente com o «graphical.target» ativo e queira mudar para um modo multiutilizador puro, sem interface gráfica. Neste caso, pode desativar o sistema gráfico isolando o «multi-user.target». Como o «graphical.target» depende do «multi-user.target», mas não o contrário, todos os serviços gráficos são interrompidos com a mudança.
No entanto, deve verificar as dependências associadas antes de isolar um alvo. Desta forma, evitará que processos importantes sejam interrompidos involuntariamente.
$ systemctl list-dependencies multi-user.targetbashSe já verificaste as unidades ativas que pretendes manter e estás de acordo com elas, podes selecionar o alvo pretendido:
$ sudo systemctl isolate multi-user.targetbashUtilização de atalhos para eventos importantes
Existem objetivos específicos para processos essenciais, como desligar ou reiniciar o sistema. No entanto, no Linux, o systemctl também oferece atalhos práticos que proporcionam funcionalidades adicionais. Por exemplo, para colocar o sistema no modo de recuperação (Single-User-Mode), basta utilizar «rescue» em vez de «isolate rescue.target».
$ sudo systemctl rescuebashPodes desligar o sistema com o comando «halt»:
$ sudo systemctl haltbashPodes iniciar um desligamento completo com o comando «poweroff»:
$ sudo systemctl poweroffbashCom «reboot» inicias um reinício:
$ sudo systemctl rebootbashEstes comandos informam os utilizadores conectados sobre os próximos eventos, algo que não é possível conseguir simplesmente executando ou isolando o alvo. É importante saber que muitos equipamentos associam os comandos mais curtos para estas ações ao systemd, a fim de garantir a sua execução correta.
Por exemplo, o comando seguinte costuma ser suficiente para reiniciar o sistema:
$ sudo rebootbash