O systemctl no Linux de­sem­pe­nha um papel central na ad­mi­nis­tra­ção do systemd, o sistema de ini­ci­a­li­za­ção e ge­ren­ci­a­dor de serviços. Com o systemctl, os usuários têm controle sobre serviços, unidades e con­fi­gu­ra­ções do systemd, tornando-o uma fer­ra­menta in­dis­pen­sá­vel para a ad­mi­nis­tra­ção do sistema. Desde o controle de ini­ci­a­li­za­ção até a mo­di­fi­ca­ção dos estados do sistema, o systemctl oferece uma gama abran­gente de fun­ci­o­na­li­da­des.

O que é systemctl?

systemctl é uma fer­ra­menta de linha de comando para gerenciar o systemd, um sistema de ini­ci­a­li­za­ção e ge­ren­ci­a­dor de sistemas para sistemas ope­ra­ci­o­nais Linux. Atu­al­mente, o systemd é o sistema de ini­ci­a­li­za­ção padrão em muitas dis­tri­bui­ções Linux e dis­tri­bui­ções de ser­vi­do­res Linux como Ubuntu, Debian, Fedora, Red Hat En­ter­prise Linux (RHEL), CentOS, Arch Linux, Mageia e Gentoo, mas não está im­ple­men­tado em todas as dis­tri­bui­ções.

No ecos­sis­tema systemd, o systemctl de­sem­pe­nha um papel central na gestão de serviços do sistema, con­fi­gu­ra­ção, com­por­ta­mento de ini­ci­a­li­za­ção e ma­nu­ten­ção do sistema. A fun­ci­o­na­li­dade da fer­ra­menta vai além de sim­ples­mente iniciar e parar serviços, ofe­re­cendo um controle abran­gente sobre quase todos os aspectos de um sistema Linux.

No tutorial a seguir, você en­con­trará exemplos de código práticos e comandos Linux para usar o systemctl com base no Ubuntu 22.04.

Gestão de serviços

O objetivo principal do sistema Init é iniciar os com­po­nen­tes ne­ces­sá­rios após a ini­ci­a­li­za­ção do kernel Linux (com­po­nen­tes do “userland”). Além disso, o sistema Init serve para controlar efe­ti­va­mente serviços e daemons em um servidor a qualquer momento durante a execução do sistema.

Dentro do systemd, a maioria dos processos se concentra em chamadas Units (unidades), que são recursos ge­ren­ci­a­dos pelo systemd. Essas unidades são clas­si­fi­ca­das pelo tipo de recurso que re­pre­sen­tam e definidas pelos chamados arquivos de unidade. O tipo de uma unidade é iden­ti­fi­cado pela extensão do arquivo.

Na ad­mi­nis­tra­ção de 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 ge­ren­ci­a­mento de serviços, pois o systemd pode re­co­nhe­cer que esses comandos ge­ral­mente se referem a serviços.

Iniciar e in­ter­rom­per serviços

As tarefas mais comuns re­a­li­za­das com o systemctl no Linux incluem iniciar e parar serviços. Essas funções são fun­da­men­tais para a ad­mi­nis­tra­ção do sistema e permitem manter o controle sobre os processos em execução no sistema. Para iniciar um serviço, use o comando start. Se você estiver tra­ba­lhando como usuário sem pri­vi­lé­gios de root, deve usar sudo:

$ sudo systemctl start application.service
bash

Como o systemd foi projetado para buscar au­to­ma­ti­ca­mente arquivos com a extensão .service para comandos de ge­ren­ci­a­mento de serviços, o comando também pode ser sim­pli­fi­cado:

$ sudo systemctl start application
bash

Para iniciar, por exemplo, o servidor web Apache, você digitaria:

$ sudo systemctl start apache2
bash

Se você deseja parar um serviço em execução, use stop:

$ sudo systemctl stop application.service
bash
VPS Hosting (Virtual Private Servers)
World-class VPS at America’s lowest price

Hos­pe­da­gem VPS poderosa e de baixo custo para rodar suas apli­ca­ções sob medida, com as­sis­tente pessoal e suporte 24 horas.

  • Save 50% or more vs leading hosts
  • Unlimited traffic & no setup fees 
  • 99.99% uptime gua­ran­teed
  • Free 24/7 premium support 

Reiniciar e re­car­re­gar serviços

Para reiniciar um serviço, o que muitas vezes é ne­ces­sá­rio após uma alteração na con­fi­gu­ra­ção, você deve usar o comando restart:

$ sudo systemctl restart application.service
bash

Se a aplicação cor­res­pon­dente é capaz de re­car­re­gar seus arquivos de con­fi­gu­ra­ção sem reiniciar, o comando reload pode ser usado para iniciar esse processo:

$ sudo systemctl reload application.service
bash

Se você não tiver certeza se um serviço oferece a opção de re­car­re­gar sua con­fi­gu­ra­ção, você pode usar o comando reload-or-restart. Este comando recarrega a con­fi­gu­ra­ção, caso essa opção seja suportada. Se não for possível, o comando realizará um reinício do serviço para aplicar a con­fi­gu­ra­ção atu­a­li­zada.

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

Ativar e desativar serviços

Ao ativar e desativar serviços, você pode definir se um serviço deve ser iniciado au­to­ma­ti­ca­mente durante a ini­ci­a­li­za­ção do sistema ou não. Isso de­sem­pe­nha um papel central na per­for­mance do sistema, na segurança e na gestão das de­pen­dên­cias entre di­fe­ren­tes serviços. Para con­fi­gu­rar um serviço para que ele seja iniciado au­to­ma­ti­ca­mente durante a ini­ci­a­li­za­ção do sistema, você deve usar o comando enable:

$ sudo systemctl enable application.service
bash

Ao executar esse processo, é criado um link simbólico. Esse link conecta a cópia do arquivo de serviço do sistema, que nor­mal­mente está lo­ca­li­zado em /lib/systemd/system ou /etc/systemd/system, ao diretório no disco onde o systemd procura arquivos para ini­ci­a­li­za­ção au­to­má­tica, ge­ral­mente em /etc/systemd/system/some_target.target.wants.

$ sudo systemctl enable application.service
bash

Para impedir que um serviço inicie au­to­ma­ti­ca­mente durante a ini­ci­a­li­za­ção do sistema, use o comando disable:

$ sudo systemctl disable application.service
bash

Isso irá excluir o link simbólico que havia sido con­fi­gu­rado para que o serviço iniciasse au­to­ma­ti­ca­mente. Atenção: Ativar 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 iniciar au­to­ma­ti­ca­mente na ini­ci­a­li­za­ção, você deve executar tanto o comando start quanto o comando enable.

Verificar status dos serviços

Com o systemctl, você pode exibir in­for­ma­ções de­ta­lha­das sobre o status dos serviços. Essa função é es­pe­ci­al­mente útil para monitorar e di­ag­nos­ti­car o estado atual dos serviços do sistema e das apli­ca­ções. Para a ve­ri­fi­ca­ção, você usa o comando status:

$ systemctl status application.service
bash

Este comando fornece uma variedade de in­for­ma­ções, incluindo o estado atual do serviço (ativo, inativo, com falhas etc.), os processos exe­cu­ta­dos re­cen­te­mente e mensagens de log, a hi­e­rar­quia cgroup e as primeiras linhas do log.

Para verificar o status atual de atividade de um serviço 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 é ge­ral­mente indicado como active quando o serviço está ativo, ou inactive quando o serviço está inativo.

Para verificar se um serviço está con­fi­gu­rado para ser ativado au­to­ma­ti­ca­mente durante a ini­ci­a­li­za­ção do sistema, você pode usar o comando is-enabled. Isso é es­pe­ci­al­mente útil para gerenciar a con­fi­gu­ra­ção de ini­ci­a­li­za­ção de serviços em um sistema Linux.

$ systemctl is-enabled application.service
bash

O comando indica se o serviço está ativado ou de­sa­ti­vado e define o código de saída como “0” ou “1”, com base na resposta.

Com o comando is-failed, você pode verificar se um de­ter­mi­nado serviço apresenta um status de erro.

$ systemctl is-failed application.service
bash

Em uma execução bem-sucedida, active será exibido, enquanto failed indicará a presença de um erro. Se a unidade foi parada in­ten­ci­o­nal­mente, a resposta pode ser unknown ou inactive. Um status de saída 0 sinaliza a ocor­rên­cia de um erro, enquanto 1 indica qualquer outro estado.

Status do sistema

Os comandos apre­sen­ta­dos até agora focam no ge­ren­ci­a­mento de serviços in­di­vi­du­ais, mas não fornecem uma visão abran­gente do estado atual do sistema. No entanto, há uma variedade de comandos systemctl que fornecem exa­ta­mente esse tipo de in­for­ma­ção.

O comando list-units é uma fer­ra­menta útil para obter uma visão geral das unidades atuais no Linux:

$ systemctl list-units
bash

Se você executar o comando, o systemctl exibirá uma lista de unidades ge­ren­ci­a­das pelo systemd. A saída dessa lista inclui várias colunas com in­for­ma­ções es­pe­cí­fi­cas sobre cada unidade. As colunas exibidas são:

  • UNIT: O nome da unidade, ge­ral­mente o nome do arquivo de unidade cor­res­pon­dente, por exemplo, sshd.service para o daemon SSH
  • LOAD: Indica se o arquivo da unidade foi carregado com sucesso; os valores possíveis são loaded, not-found ou error.
  • ACTIVE: O status de atividade da unidade; pode assumir valores como active, inactive, activating ou deactivating.
  • SUB: O status de atividade su­bor­di­nado, que fornece mais detalhes sobre o estado da unidade; por exemplo, uma unidade active pode ter um status SUB de running, exited ou failed.
  • DES­CRIP­TION: Uma breve descrição da unidade, que ge­ral­mente reflete o propósito ou a fun­ci­o­na­li­dade da unidade

No entanto, o comando por padrão exibe apenas unidades ativas, portanto, na saída, a coluna LOAD ti­pi­ca­mente mostra loaded e a coluna ACTIVE active. Com flags adi­ci­o­nais, é possível con­fi­gu­rar o systemctl para exibir in­for­ma­ções mais de­ta­lha­das. Por exemplo, para exibir todas as unidades car­re­ga­das pelo systemd, in­de­pen­den­te­mente de seu status atual, utilize a flag --all.:

$ systemctl list-units --all
bash

A saída pode ser refinada ainda mais usando flags 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 a flag --all para que as unidades inativas também sejam exibidas.

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

Com o filtro --type=, você pode exibir apenas de­ter­mi­na­dos tipos de unidades, como, por exemplo, exibir ex­clu­si­va­mente unidades de serviço ativas.

$ systemctl list-units --type=service
bash

Listar todos os arquivos de unidade

Para exibir uma lista de todos os arquivos de unidade com o systemctl no Linux – incluindo aqueles que o systemd não tentou carregar –, você pode usar list-unit-files. Este comando mostra todos os arquivos de unidade co­nhe­ci­dos pelo systemd, incluindo serviços, sockets, targets e outros.

$ systemctl list-units-files
bash

O comando exibe di­fe­ren­tes estados dos arquivos de unidade. Esses estados indicam como as unidades estão con­fi­gu­ra­das, es­pe­ci­al­mente em relação ao seu com­por­ta­mento na ini­ci­a­li­za­ção do sistema. Os estados mais comuns são:

  • Enabled: A unidade está con­fi­gu­rada para ser iniciada au­to­ma­ti­ca­mente na ini­ci­a­li­za­ção do sistema.
  • Disabled: A unidade não está con­fi­gu­rada para iniciar au­to­ma­ti­ca­mente durante o boot.
  • Masked: A unidade está com­ple­ta­mente de­sa­ti­vada, impedindo que seja iniciada ma­nu­al­mente ou au­to­ma­ti­ca­mente.
  • Static: A unidade não é iniciada de forma in­de­pen­dente, mas nor­mal­mente depende de outra unidade e é iniciada apenas nesse contexto.

Gestão de unidades

A ad­mi­nis­tra­ção de 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 gerenciá-las, o systemctl oferece uma série de comandos e opções úteis.

Exibir arquivo de unidade

Com o comando cat, você pode vi­su­a­li­zar o conteúdo de um arquivo de unidade di­re­ta­mente no console. Para, por exemplo, ver o arquivo de unidade de um serviço como ssh.service, use o seguinte comando:

$ systemctl cat ssh.service
bash

Vi­su­a­li­zar de­pen­dên­cias

As de­pen­dên­cias de uma unidade es­pe­cí­fica podem ser exibidas em forma de árvore usando o comando list-dependencies. O comando é o seguinte:

$ systemctl list-dependencies sshd.service
bash

Por padrão, as de­pen­dên­cias são exibidas para unidades .target, que re­pre­sen­tam di­fe­ren­tes estados do sistema. Para obter uma listagem completa e recursiva de todas as de­pen­dên­cias, use o flag --all.

Para exibir de­pen­dên­cias reversas, ou seja, unidades que dependem da unidade es­pe­ci­fi­cada, adicione --reverse ao comando. Além disso, os flags --before e --after permitem vi­su­a­li­zar as de­pen­dên­cias que iniciam antes ou depois da unidade em questão.

Mascarar e des­mas­ca­rar unidades

Ao mascarar uma unidade, você a desativa efe­ti­va­mente, impedindo que ela seja iniciada ma­nu­al­mente ou au­to­ma­ti­ca­mente. Isso é fre­quen­te­mente utilizado para garantir que um serviço ou unidade não seja iniciado aci­den­tal­mente ou au­to­ma­ti­ca­mente devido a de­pen­dên­cias. O mas­ca­ra­mento é realizado criando um link simbólico do arquivo da unidade para /dev/null com o comando mask:

$ sudo systemctl mask nginx.service
bash

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

Des­mas­ca­rar remove o estado de mas­ca­ra­mento de uma unidade, per­mi­tindo que ela seja iniciada nor­mal­mente novamente. O comando para des­mas­ca­rar é unmask.

$ sudo systemctl unmask nginx.service
bash

Editar arquivos de unidade

O systemctl possui opções para ajustar e modificar arquivos de unidade. Esse recurso foi in­tro­du­zido na versão 218 do systemd. Quando você usa o comando edit, ele abre au­to­ma­ti­ca­mente um arquivo de unidade para edição:

$ sudo systemctl edit nginx.service
bash

Ao editar, é criado um arquivo vazio para adicionar ou modificar ins­tru­ções es­pe­cí­fi­cas na definição da unidade. Para cada unidade, como nginx.service, é criado um sub­di­re­tó­rio no diretório /etc/systemd/system, com o nome do arquivo seguido por .d – neste caso, nginx.service.d.

Dentro deste sub­di­re­tó­rio, é gerado o arquivo override.conf. Quando o systemd carrega a unidade, ele combina o conteúdo deste arquivo de fragmento com o arquivo de unidade original, dando pri­o­ri­dade às ins­tru­ções do fragmento. Para editar o arquivo de unidade completo, pode-se usar a opção --full:

$ sudo systemctl edit --full nginx.service
bash

Com a opção --full, o arquivo de unidade existente é aberto em um editor para mo­di­fi­ca­ções. Ao sair do editor, o sistema salva o arquivo editado em /etc/systemd/system.

Para reverter al­te­ra­ções feitas, você pode excluir o diretório de con­fi­gu­ra­ção .d da unidade ou o arquivo mo­di­fi­cado em /etc/systemd/system:

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

Uma unidade de arquivo com­ple­ta­mente revisada pode ser excluída com o seguinte comando:

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

Após remover o arquivo ou diretório, é ne­ces­sá­rio re­car­re­gar o systemd para que ele pare de re­fe­ren­ciar os arquivos excluídos e passe a usar a cópia original do sistema.

$ sudo systemctl daemon-reload
bash

Ajustar estado do sistema (runlevel) com objetivos

Os objetivos em systemd servem prin­ci­pal­mente para agrupar di­fe­ren­tes unidades a fim de realizar estados es­pe­cí­fi­cos do sistema – se­me­lhante aos runlevels em outros sistemas Init. Os arquivos com o sufixo .target funcionam como pontos de re­fe­rên­cia que indicam o status de dis­po­ni­bi­li­dade de certas fun­ci­o­na­li­da­des, per­mi­tindo que os usuários es­pe­ci­fi­quem o estado geral desejado em vez das unidades in­di­vi­du­ais ne­ces­sá­rias.

Um exemplo prático é o swap.target, que marca o estado de prontidão do swap. Unidades en­vol­vi­das no processo de swap podem ser ajustadas usando opções de con­fi­gu­ra­ção como WantedBy= ou RequiredBy= para se alinharem a esse objetivo. Unidades que dependem do swap podem indicar isso por meio de con­fi­gu­ra­ções como Wants=, Requires= e After=, para expressar sua de­pen­dên­cia e a ordem de ini­ci­a­li­za­ção em relação ao swap.

Recuperar e con­fi­gu­rar o objetivo padrão

Recuperar e con­fi­gu­rar o objetivo padrão permite de­ter­mi­nar um estado padrão do sistema que seu sistema deve alcançar ao iniciar. Veja como encontrar o objetivo padrão para o seu sistema:

$ systemctl get-default
Output
multi-user.target
bash

Se você deseja alterar o objetivo padrão, use o comando set-default junto com o nome do objetivo. Com o seguinte comando, você define o objetivo padrão como graphical.target, o que fará com que uma interface gráfica seja iniciada:

$ sudo systemctl set-default graphical.target
bash

Listar objetivos dis­po­ní­veis

Para listar todos os objetivos dis­po­ní­veis em seu sistema, você pode usar o seguinte comando:

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

Isso exibirá uma lista de todos os arquivos de unidade de destino ins­ta­la­dos em seu sistema. Para cada objetivo, serão mostrados o caminho e o status atual (por exemplo, ativado ou de­sa­ti­vado).

Isolar objetivos

Com o comando isolate, você pode ativar todas as unidades as­so­ci­a­das a um objetivo es­pe­cí­fico e, ao mesmo tempo, parar todas as outras unidades não as­so­ci­a­das.

Por exemplo, se você estiver tra­ba­lhando em um ambiente com o graphical.target ativo e quiser mudar para um modo mul­tiu­suá­rio puro sem interface gráfica, você pode isolar o multi-user.target. Isso de­sa­ti­vará o sistema gráfico. Como o graphical.target depende do multi-user.target, mas não o contrário, ao mudar, todos os serviços gráficos serão parados.

No entanto, antes de isolar um objetivo, é re­co­men­dá­vel verificar as de­pen­dên­cias as­so­ci­a­das para evitar a parada in­de­se­jada de processos im­por­tan­tes.

$ systemctl list-dependencies multi-user.target
bash

Caso você tenha ve­ri­fi­cado e esteja de acordo com as unidades ativas que deseja manter, pode isolar o objetivo desejado:

$ sudo systemctl isolate multi-user.target
bash

Usar atalhos para eventos im­por­tan­tes

Existem objetivos es­pe­cí­fi­cos para operações es­sen­ci­ais como desligar ou reiniciar o sistema. No entanto, o systemctl no Linux também oferece atalhos práticos que fornecem fun­ci­o­na­li­da­des adi­ci­o­nais. Por exemplo, para colocar o sistema em modo de resgate (modo de usuário único), você pode usar rescue em vez de isolate rescue.target:

$ sudo systemctl rescue
bash

Com halt, você pode parar o sistema:

$ sudo systemctl halt
bash

Para um completo des­li­ga­mento, você pode usar poweroff:

$ sudo systemctl poweroff
bash

Para reiniciar o sistema, utilize reboot:

$ sudo systemctl reboot
bash

Esses comandos informam os usuários co­nec­ta­dos sobre os eventos iminentes, algo que não é alcançado apenas com a execução ou iso­la­mento de alvos. É im­por­tante saber que muitos sistemas associam os comandos mais curtos para essas ações com o systemd para garantir uma execução correta.

Para um reinício do sistema, nor­mal­mente o seguinte comando é su­fi­ci­ente:

$ sudo reboot
bash
Ir para o menu principal