No Linux, o systemctl de­sem­pe­nha um papel central na gestão do sistema init e do gestor de serviços systemd. Com o systemctl, os uti­li­za­do­res têm controlo sobre os serviços, unidades e con­fi­gu­ra­ções do systemd, o que o torna uma fer­ra­menta in­dis­pen­sá­vel para a ad­mi­nis­tra­ção do sistema. Desde o controlo do arranque até à per­so­na­li­za­ção dos estados do sistema, o systemctl oferece uma vasta gama de fun­ci­o­na­li­da­des.

O que é o systemctl?

O systemctl é uma fer­ra­menta de linha de comandos para gerir o systemd, um sistema de ini­ci­a­li­za­ção e gestor de sistemas para sistemas ope­ra­ti­vos Linux. O systemd é atu­al­mente o sistema de ini­ci­a­li­za­ção padrão em muitas dis­tri­bui­ções Linux ou dis­tri­bui­ções Linux para ser­vi­do­res, como o Ubuntu, Debian, Fedora, Red Hat En­ter­prise Linux (RHEL), CentOS, Arch Linux, Mageia ou Gentoo, mas não está im­ple­men­tado de forma universal em todas as dis­tri­bui­ções.

No ecos­sis­tema systemd, o systemctl de­sem­pe­nha um papel central na gestão dos serviços do sistema, na con­fi­gu­ra­ção, no com­por­ta­mento de arranque e na ma­nu­ten­ção do sistema. A fun­ci­o­na­li­dade da fer­ra­menta vai além do simples arranque e paragem de serviços, ofe­re­cendo um controlo abran­gente sobre quase todos os aspetos de um sistema Linux.

No tutorial a seguir, en­con­trará 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 com­po­nen­tes ne­ces­sá­rios após o arranque do kernel do Linux (com­po­nen­tes do «userland»). Além disso, o sistema init é utilizado para controlar efi­caz­mente 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 co­nhe­ci­das unidades; ou seja, recursos que são geridos pelo systemd. Estas unidades são clas­si­fi­ca­das de acordo com o tipo de recurso que re­pre­sen­tam e são definidas através dos chamados ficheiros de unidade. O tipo de unidade pode ser iden­ti­fi­cado pela extensão do ficheiro.

Ao gerir serviços, as unidades de serviço que terminam com o sufixo .service são par­ti­cu­lar­mente im­por­tan­tes. No entanto, muitas vezes não é ne­ces­sá­rio es­pe­ci­fi­car este sufixo nos comandos de gestão de serviços, uma vez que o systemd consegue re­co­nhe­cer que esses comandos se referem, nor­mal­mente, a serviços.

Início e in­ter­rup­ção dos serviços

As tarefas mais comuns re­a­li­za­das com o systemctl no Linux incluem iniciar e parar serviços. Estas funções são fun­da­men­tais 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 uti­li­za­dor sem direitos de root, deve utilizar «sudo»:

$ sudo systemctl start application.service
bash

Como o systemd foi concebido para procurar au­to­ma­ti­ca­mente ficheiros .service para comandos de gestão de serviços, o comando também pode ser in­tro­du­zido de forma sim­pli­fi­cada:

$ sudo systemctl start application
bash

Por exemplo, para iniciar o servidor web Apache, digite:

$ sudo systemctl start apache2
bash

Se quiseres parar um serviço em execução, usa o comando «stop»:

$ sudo systemctl stop application.service
bash

Reinício e recarga

Para reiniciar um serviço, o que nor­mal­mente é ne­ces­sá­rio após uma alteração na con­fi­gu­ra­ção, utilize o comando «restart»:

$ sudo systemctl restart application.service
bash

Se a aplicação em questão for capaz de re­car­re­gar os seus ficheiros de con­fi­gu­ra­ção sem reiniciar, pode utilizar o comando «reload» para iniciar este processo:

$ sudo systemctl reload application.service
bash

Se não tiver a certeza se um serviço oferece a opção de re­car­re­gar a sua con­fi­gu­ra­ção, pode utilizar o comando «reload-or-restart». A con­fi­gu­ra­ção será re­car­re­gada se essa opção for com­pa­tí­vel. Caso contrário, o comando irá reiniciar o serviço para aplicar a con­fi­gu­ra­ção atu­a­li­zada.

$ sudo systemctl reload-or-restart application.service
bash

Ativação e de­sa­ti­va­ção dos serviços

Ao ativar e desativar os serviços, pode es­pe­ci­fi­car se estes devem ser iniciados au­to­ma­ti­ca­mente ou não ao arrancar o sistema. Isto é es­pe­ci­al­mente im­por­tante para o de­sem­pe­nho do sistema, a segurança e a gestão das de­pen­dên­cias entre os di­fe­ren­tes serviços. Para con­fi­gu­rar um serviço de modo a que seja executado au­to­ma­ti­ca­mente ao arrancar o sistema, utilize o comando «enable»:

$ sudo systemctl enable application.service
bash

Quando este processo é executado, é criado um link simbólico. Este link liga a cópia do ficheiro de serviço do sistema, que nor­mal­mente 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 au­to­má­tico, o que nor­mal­mente ocorre em /etc/systemd/system/some_target.target.wants.

$ sudo systemctl enable application.service
bash

Para impedir que um serviço seja iniciado au­to­ma­ti­ca­mente ao arrancar o sistema, utilize «disable»:

$ sudo systemctl disable application.service
bash

Isto elimina o link simbólico que an­te­ri­or­mente es­pe­ci­fi­cava que o serviço deveria ser iniciado au­to­ma­ti­ca­mente. Atenção: a simples ativação de um serviço não o inicia ime­di­a­ta­mente na sessão atual. Para iniciar o serviço ime­di­a­ta­mente e configurá-lo para que seja iniciado au­to­ma­ti­ca­mente no arranque, deve executar os comandos «start» e «enable».

Ve­ri­fi­ca­ção do estado dos serviços

Com o systemctl, é possível exibir in­for­ma­ções de­ta­lha­das sobre o estado dos serviços. Esta função é es­pe­ci­al­mente útil para mo­ni­to­ri­zar e di­ag­nos­ti­car o estado atual dos serviços do sistema e das apli­ca­ções. Utilize o comando «status» para verificar:

$ systemctl status application.service
bash

Este comando fornece uma vasta gama de in­for­ma­ções, incluindo o estado atual do serviço (ativo, inativo, com falha, etc.), os processos e mensagens de registo exe­cu­ta­dos mais re­cen­te­mente, a hi­e­rar­quia 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á atu­al­mente ativo ou não:

$ systemctl is-active application.service
bash

O estado atual é nor­mal­mente 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á con­fi­gu­rado para ser ativado au­to­ma­ti­ca­mente no arranque do sistema. Isto é es­pe­ci­al­mente útil para gerir as con­fi­gu­ra­ções de arranque dos serviços num sistema Linux.

$ systemctl is-enabled application.service
bash

O comando indica se o serviço está ativado ou de­sa­ti­vado e, con­se­quen­te­mente, define o código de saída como «0» ou «1», de­pen­dendo da resposta.

Também pode utilizar o comando «is-failed» para verificar se um serviço es­pe­cí­fico se encontra em estado de erro:

$ systemctl is-failed application.service
bash

Se a execução for bem-sucedida, aparece «active»; se ocorrer um erro, aparece «failed». Se a unidade tiver sido parada in­ten­ci­o­nal­mente, 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 apre­sen­ta­dos até agora centram-se na gestão de serviços in­di­vi­du­ais, 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 in­for­ma­ção.

O «list-units» é uma fer­ra­menta útil para obter uma visão geral das unidades atu­al­mente dis­po­ní­veis no Linux:

$ systemctl list-units
bash

Quando o comando é executado, o systemctl apresenta uma lista das unidades geridas pelo systemd. A apre­sen­ta­ção desta lista inclui várias colunas com in­for­ma­ções es­pe­cí­fi­cas sobre cada unidade. Essas colunas mostram o seguinte:

  • UNIT: o nome da unidade, ge­ral­mente cor­res­ponde ao nome do ficheiro de con­fi­gu­ra­ção da unidade; por exemplo, sshd.service para os daemons SSH.
  • LOAD: indica se um ficheiro da unidade foi carregado cor­re­ta­mente; os valores possíveis são «loaded», «not-found» ou «error».
  • ACTIVE: o estado de atividade da unidade; pode assumir valores como «active», «inactive», «ac­ti­va­ting» ou «de­ac­ti­va­ting».
  • SUB: o estado de atividade su­bor­di­nado, que fornece detalhes sobre o estado da unidade; por exemplo, uma unidade «active» pode ter um estado SUB de «running», «exited» ou «failed».
  • DES­CRIP­TION: uma breve descrição da unidade que ge­ral­mente reflete o objetivo ou a fun­ci­o­na­li­dade da unidade.

No entanto, por pre­de­fi­ni­ção, o comando mostra apenas as unidades ativas, pelo que a coluna LOAD da saída costuma apre­sen­tar «loaded» e a coluna ACTIVE «active». Com opções adi­ci­o­nais, o systemctl pode ser con­fi­gu­rado para apre­sen­tar também in­for­ma­ções mais de­ta­lha­das. Por exemplo, para mostrar todas as unidades car­re­ga­das pelo systemd, in­de­pen­den­te­mente do seu estado de atividade atual, utilize a opção «–all»:

$ systemctl list-units --all
bash

A saída pode ser ainda mais refinada uti­li­zando in­di­ca­do­res adi­ci­o­nais, como «–state=», para filtrar estados es­pe­cí­fi­cos nas ca­te­go­rias LOAD, ACTIVE ou SUB. É im­por­tante manter o indicador «–all» para que também sejam apre­sen­ta­das as unidades inativas:

$ systemctl list-units --all --state=inactive
bash

Também pode utilizar o filtro «–type=» para mostrar apenas de­ter­mi­na­dos tipos de unidades; por exemplo, para ver apenas as unidades em serviço ativo:

$ systemctl list-units --type=service
bash

Lista de todos os ficheiros da unidade

Para apre­sen­tar 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 co­nhe­ci­dos pelo systemd, incluindo serviços, sockets, objetivos, etc.

$ systemctl list-units-files
bash

O comando apresenta vários estados dos ficheiros das unidades. Estes estados indicam como as unidades cor­res­pon­den­tes estão con­fi­gu­ra­das, no­me­a­da­mente no que diz respeito ao seu com­por­ta­mento no arranque do sistema. Os estados mais comuns são:

  • Ativado: a unidade está con­fi­gu­rada para ser ativada au­to­ma­ti­ca­mente ao iniciar o sistema.
  • De­sa­ti­vado: a unidade não está con­fi­gu­rada para iniciar au­to­ma­ti­ca­mente durante o processo de arranque.
  • Masked: a unidade está com­ple­ta­mente de­sa­ti­vada, pelo que não é possível iniciá-la nem ma­nu­al­mente nem au­to­ma­ti­ca­mente.
  • Estática: a unidade não inicia de forma in­de­pen­dente, mas depende nor­mal­mente de outra unidade e só inicia neste contexto

Gestão das unidades

A gestão das unidades é uma das prin­ci­pais funções do systemctl. Para obter in­for­ma­ções mais es­pe­cí­fi­cas sobre unidades in­di­vi­du­ais e sobre como geri-las, o systemctl dis­po­ni­bi­liza uma série de comandos e opções úteis.

Vi­su­a­li­za­ção de um ficheiro de unidade

Pode utilizar o comando «cat» para apre­sen­tar o conteúdo de um ficheiro de unidade es­pe­cí­fico di­re­ta­mente no painel. Por exemplo, para ver o ficheiro de unidade de um serviço como o ssh.service, introduza:

$ systemctl cat ssh.service
bash

Vi­su­a­li­za­ção de de­pen­dên­cias

As de­pen­dên­cias de uma unidade es­pe­cí­fica podem ser apre­sen­ta­das numa estrutura em árvore uti­li­zando o comando «list-de­pen­den­cies». O comando tem o seguinte formato:

$ systemctl list-dependencies sshd.service
bash

Por pre­de­fi­ni­ção, as de­pen­dên­cias são apre­sen­ta­das para as unidades «.target» que re­pre­sen­tam di­fe­ren­tes estados do sistema. Para obter uma lista completa e recursiva de todas as de­pen­dên­cias, utilize o parâmetro «–all».

Para mostrar as de­pen­dên­cias inversas, ou seja, as unidades que dependem da unidade es­pe­ci­fi­cada, adicione «–reverse» ao comando. Além disso, os in­di­ca­do­res «–before» e «–after» permitem ver as de­pen­dên­cias que começam antes ou depois da unidade em questão.

Ocultação e revelação de unidades

O mas­ca­ra­mento de uma unidade desativa-a, impedindo que seja iniciada ma­nu­al­mente ou au­to­ma­ti­ca­mente. Esta prática é fre­quen­te­mente utilizada para garantir que os de­pen­den­tes não iniciem aci­den­tal­mente ou au­to­ma­ti­ca­mente um serviço ou uma unidade. O mas­ca­ra­mento é 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.service
bash

Isto garante que o serviço Nginx não possa ser iniciado ma­nu­al­mente nem au­to­ma­ti­ca­mente enquanto estiver no modo de mas­ca­ra­mento.

O comando «unmask» desativa o estado de máscara de uma unidade, para que esta possa reiniciar nor­mal­mente. O comando para desativar a máscara é «unmask»:

$ sudo systemctl unmask nginx.service
bash

Edição de ficheiros de unidade

O systemctl dispõe de opções para per­so­na­li­zar e modificar ficheiros de unidade. Esta fun­ci­o­na­li­dade foi in­tro­du­zida na versão 218 do systemd. Se utilizar o comando «edit», abre-se au­to­ma­ti­ca­mente um ficheiro de unidade da unidade se­le­ci­o­nada para edição:

$ sudo systemctl edit nginx.service
bash

Ao editar, é criado um ficheiro vazio para adicionar ou alterar ins­tru­ções es­pe­cí­fi­cas à 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 ins­tru­ções do snippet têm pri­o­ri­dade. Para processar o ficheiro de unidade completo, pode utilizar o indicador «–full»:

$ sudo systemctl edit --full nginx.service
bash

Com a opção «–full», o ficheiro da unidade existente é aberto num editor para que se possam efetuar al­te­ra­ções. Ao sair do editor, o sistema guarda o ficheiro editado em «/etc/systemd/system».

Para reverter as al­te­ra­ções que tenha feito, pode eliminar o diretório de con­fi­gu­ra­ção «.d» da unidade ou o ficheiro alterado em «/etc/systemd/system»:

$ sudo rm -r /etc/systemd/system/nginx.service.d
bash

Uma imagem de unidade to­tal­mente atu­a­li­zada é apagada com o seguinte comando:

$ sudo rm /etc/systemd/system/nginx.service
bash

Depois de eliminar o ficheiro ou a pasta, é ne­ces­sá­rio reiniciar o systemd para que este deixe de fazer re­fe­rên­cia aos ficheiros eli­mi­na­dos e, em vez disso, volte a utilizar a cópia do próprio sistema:

$ sudo systemctl daemon-reload
bash

Adaptação do estado do sistema (Runlevel) com objetivos

Os alvos no systemd são uti­li­za­dos prin­ci­pal­mente para agrupar di­fe­ren­tes unidades com o objetivo de definir estados es­pe­cí­fi­cos do sistema (se­me­lhante ao Runlevel noutros sistemas init). Os ficheiros com a extensão «.target» funcionam como pontos de re­fe­rên­cia que indicam o estado de dis­po­ni­bi­li­dade de de­ter­mi­na­das fun­ci­o­na­li­da­des, per­mi­tindo que os uti­li­za­do­res es­pe­ci­fi­quem o estado geral pre­ten­dido, em vez das unidades in­di­vi­du­ais ne­ces­sá­rias.

Um exemplo prático é o «swap.target», que indica o estado de pre­pa­ra­ção para a troca. As unidades que par­ti­ci­pam no processo de troca podem sin­cro­ni­zar-se com este objetivo através de opções de con­fi­gu­ra­ção como «WantedBy=» ou «Re­qui­redBy=». 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 de­pen­dên­cia e sequência de arranque em relação ao swap.

Re­cu­pe­ra­ção e con­fi­gu­ra­ção da lente padrão

A re­cu­pe­ra­ção e con­fi­gu­ra­çã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.target
bash

Se quiser alterar o destino padrão, utilize o comando «set-default» jun­ta­mente 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 uti­li­za­dor:

$ sudo systemctl set-default graphical.target
bash

Lista dos objetivos dis­po­ní­veis

Para listar todos os objetivos dis­po­ní­veis no teu sistema, podes utilizar o seguinte comando:

$ systemctl list-unit-files --type=target
bash

É apre­sen­tada uma lista de todos os ficheiros da unidade de destino ins­ta­la­dos no sistema. Para cada destino, é apre­sen­tado o caminho e o estado atual (por exemplo, ativado ou de­sa­ti­vado).

Iso­la­mento de alvos

Com «isolate», podes ativar todas as unidades que estejam ligadas a um alvo es­pe­cí­fico e, ao mesmo tempo, parar todas as outras unidades que não estejam ligadas a ele.

Su­po­nha­mos que esteja a trabalhar num ambiente com o «graphical.target» ativo e queira mudar para um modo mul­tiu­ti­li­za­dor 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 in­ter­rom­pi­dos com a mudança.

No entanto, deve verificar as de­pen­dên­cias as­so­ci­a­das antes de isolar um alvo. Desta forma, evitará que processos im­por­tan­tes sejam in­ter­rom­pi­dos in­vo­lun­ta­ri­a­mente.

$ systemctl list-dependencies multi-user.target
bash

Se já ve­ri­fi­caste as unidades ativas que pretendes manter e estás de acordo com elas, podes se­le­ci­o­nar o alvo pre­ten­dido:

$ sudo systemctl isolate multi-user.target
bash

Uti­li­za­ção de atalhos para eventos im­por­tan­tes

Existem objetivos es­pe­cí­fi­cos para processos es­sen­ci­ais, como desligar ou reiniciar o sistema. No entanto, no Linux, o systemctl também oferece atalhos práticos que pro­por­ci­o­nam fun­ci­o­na­li­da­des adi­ci­o­nais. Por exemplo, para colocar o sistema no modo de re­cu­pe­ra­ção (Single-User-Mode), basta utilizar «rescue» em vez de «isolate rescue.target».

$ sudo systemctl rescue
bash

Podes desligar o sistema com o comando «halt»:

$ sudo systemctl halt
bash

Podes iniciar um des­li­ga­mento completo com o comando «poweroff»:

$ sudo systemctl poweroff
bash

Com «reboot» inicias um reinício:

$ sudo systemctl reboot
bash

Estes comandos informam os uti­li­za­do­res co­nec­ta­dos sobre os próximos eventos, algo que não é possível conseguir sim­ples­mente exe­cu­tando ou isolando o alvo. É im­por­tante saber que muitos equi­pa­men­tos 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 su­fi­ci­ente para reiniciar o sistema:

$ sudo reboot
bash
Ir para o menu principal