systemctl: Gerenciar serviços e unidades do systemd

O systemctl no Linux desempenha um papel central na administração do systemd, o sistema de inicialização e gerenciador de serviços. Com o systemctl, os usuários têm controle sobre serviços, unidades e configurações do systemd, tornando-o uma ferramenta indispensável para a administração do sistema. Desde o controle de inicialização até a modificação dos estados do sistema, o systemctl oferece uma gama abrangente de funcionalidades.

O que é systemctl?

systemctl é uma ferramenta de linha de comando para gerenciar o systemd, um sistema de inicialização e gerenciador de sistemas para sistemas operacionais Linux. Atualmente, o systemd é o sistema de inicialização padrão em muitas distribuições Linux e distribuições de servidores Linux como Ubuntu, Debian, Fedora, Red Hat Enterprise Linux (RHEL), CentOS, Arch Linux, Mageia e Gentoo, mas não está implementado em todas as distribuições.

No ecossistema systemd, o systemctl desempenha um papel central na gestão de serviços do sistema, configuração, comportamento de inicialização e manutenção do sistema. A funcionalidade da ferramenta vai além de simplesmente iniciar e parar serviços, oferecendo um controle abrangente sobre quase todos os aspectos de um sistema Linux.

No tutorial a seguir, você encontrará 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 componentes necessários após a inicialização do kernel Linux (componentes do “userland”). Além disso, o sistema Init serve para controlar efetivamente 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 gerenciados pelo systemd. Essas unidades são classificadas pelo tipo de recurso que representam e definidas pelos chamados arquivos de unidade. O tipo de uma unidade é identificado pela extensão do arquivo.

Na administração de 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 gerenciamento de serviços, pois o systemd pode reconhecer que esses comandos geralmente se referem a serviços.

Iniciar e interromper serviços

As tarefas mais comuns realizadas com o systemctl no Linux incluem iniciar e parar serviços. Essas funções são fundamentais para a administraçã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 trabalhando como usuário sem privilégios de root, deve usar sudo:

$ sudo systemctl start application.service
bash

Como o systemd foi projetado para buscar automaticamente arquivos com a extensão .service para comandos de gerenciamento de serviços, o comando também pode ser simplificado:

$ 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
vServer (VPS) da IONOS

Hospedagem VPS poderosa e de baixo custo para rodar suas aplicações sob medida, com assistente pessoal e suporte 24 horas.

  • Armazenamento 100% SSD
  • Pronto em 55 segundos
  • Certificado SSL

Reiniciar e recarregar serviços

Para reiniciar um serviço, o que muitas vezes é necessário após uma alteração na configuração, você deve usar o comando restart:

$ sudo systemctl restart application.service
bash

Se a aplicação correspondente é capaz de recarregar seus arquivos de configuraçã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 recarregar sua configuração, você pode usar o comando reload-or-restart. Este comando recarrega a configuraçã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 configuração atualizada.

$ 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 automaticamente durante a inicialização do sistema ou não. Isso desempenha um papel central na performance do sistema, na segurança e na gestão das dependências entre diferentes serviços. Para configurar um serviço para que ele seja iniciado automaticamente durante a inicializaçã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 normalmente está localizado em /lib/systemd/system ou /etc/systemd/system, ao diretório no disco onde o systemd procura arquivos para inicialização automática, geralmente em /etc/systemd/system/some_target.target.wants.

$ sudo systemctl enable application.service
bash

Para impedir que um serviço inicie automaticamente durante a inicialização do sistema, use o comando disable:

$ sudo systemctl disable application.service
bash

Isso irá excluir o link simbólico que havia sido configurado para que o serviço iniciasse automaticamente. Atenção: Ativar um serviço não o inicia imediatamente na sessão atual. Para iniciar o serviço imediatamente e configurá-lo para iniciar automaticamente na inicialização, você deve executar tanto o comando start quanto o comando enable.

Verificar status dos serviços

Com o systemctl, você pode exibir informações detalhadas sobre o status dos serviços. Essa função é especialmente útil para monitorar e diagnosticar o estado atual dos serviços do sistema e das aplicações. Para a verificação, você usa o comando status:

$ systemctl status application.service
bash

Este comando fornece uma variedade de informações, incluindo o estado atual do serviço (ativo, inativo, com falhas etc.), os processos executados recentemente e mensagens de log, a hierarquia 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á atualmente ativo ou não:

$ systemctl is-active application.service
bash

O estado atual é geralmente indicado como active quando o serviço está ativo, ou inactive quando o serviço está inativo.

Para verificar se um serviço está configurado para ser ativado automaticamente durante a inicialização do sistema, você pode usar o comando is-enabled. Isso é especialmente útil para gerenciar a configuração de inicialização de serviços em um sistema Linux.

$ systemctl is-enabled application.service
bash

O comando indica se o serviço está ativado ou desativado 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 determinado 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 intencionalmente, a resposta pode ser unknown ou inactive. Um status de saída 0 sinaliza a ocorrência de um erro, enquanto 1 indica qualquer outro estado.

Status do sistema

Os comandos apresentados até agora focam no gerenciamento de serviços individuais, mas não fornecem uma visão abrangente do estado atual do sistema. No entanto, há uma variedade de comandos systemctl que fornecem exatamente esse tipo de informação.

O comando list-units é uma ferramenta ú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 gerenciadas pelo systemd. A saída dessa lista inclui várias colunas com informações específicas sobre cada unidade. As colunas exibidas são:

  • UNIT: O nome da unidade, geralmente o nome do arquivo de unidade correspondente, 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 subordinado, que fornece mais detalhes sobre o estado da unidade; por exemplo, uma unidade active pode ter um status SUB de running, exited ou failed.
  • DESCRIPTION: Uma breve descrição da unidade, que geralmente reflete o propósito ou a funcionalidade da unidade

No entanto, o comando por padrão exibe apenas unidades ativas, portanto, na saída, a coluna LOAD tipicamente mostra loaded e a coluna ACTIVE active. Com flags adicionais, é possível configurar o systemctl para exibir informações mais detalhadas. Por exemplo, para exibir todas as unidades carregadas pelo systemd, independentemente de seu status atual, utilize a flag --all.:

$ systemctl list-units --all
bash

A saída pode ser refinada ainda mais usando flags adicionais, como --state=, para filtrar estados específicos nas categorias LOAD, ACTIVE ou SUB. É importante 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 determinados tipos de unidades, como, por exemplo, exibir exclusivamente 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 conhecidos pelo systemd, incluindo serviços, sockets, targets e outros.

$ systemctl list-units-files
bash

O comando exibe diferentes estados dos arquivos de unidade. Esses estados indicam como as unidades estão configuradas, especialmente em relação ao seu comportamento na inicialização do sistema. Os estados mais comuns são:

  • Enabled: A unidade está configurada para ser iniciada automaticamente na inicialização do sistema.
  • Disabled: A unidade não está configurada para iniciar automaticamente durante o boot.
  • Masked: A unidade está completamente desativada, impedindo que seja iniciada manualmente ou automaticamente.
  • Static: A unidade não é iniciada de forma independente, mas normalmente depende de outra unidade e é iniciada apenas nesse contexto.

Gestão de unidades

A administração de unidades é uma das principais funções do systemctl. Para obter informações mais específicas sobre unidades individuais 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 visualizar o conteúdo de um arquivo de unidade diretamente 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

Visualizar dependências

As dependências de uma unidade especí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 dependências são exibidas para unidades .target, que representam diferentes estados do sistema. Para obter uma listagem completa e recursiva de todas as dependências, use o flag --all.

Para exibir dependências reversas, ou seja, unidades que dependem da unidade especificada, adicione --reverse ao comando. Além disso, os flags --before e --after permitem visualizar as dependências que iniciam antes ou depois da unidade em questão.

Mascarar e desmascarar unidades

Ao mascarar uma unidade, você a desativa efetivamente, impedindo que ela seja iniciada manualmente ou automaticamente. Isso é frequentemente utilizado para garantir que um serviço ou unidade não seja iniciado acidentalmente ou automaticamente devido a dependências. O mascaramento é 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 mascaramento, não possa ser iniciado manualmente ou automaticamente.

Desmascarar remove o estado de mascaramento de uma unidade, permitindo que ela seja iniciada normalmente novamente. O comando para desmascarar é 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 introduzido na versão 218 do systemd. Quando você usa o comando edit, ele abre automaticamente um arquivo de unidade para edição:

$ sudo systemctl edit nginx.service
bash

Ao editar, é criado um arquivo vazio para adicionar ou modificar instruções específicas na definição da unidade. Para cada unidade, como nginx.service, é criado um subdiretório no diretório /etc/systemd/system, com o nome do arquivo seguido por .d – neste caso, nginx.service.d.

Dentro deste subdiretó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 prioridade às instruçõ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 modificações. Ao sair do editor, o sistema salva o arquivo editado em /etc/systemd/system.

Para reverter alterações feitas, você pode excluir o diretório de configuração .d da unidade ou o arquivo modificado em /etc/systemd/system:

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

Uma unidade de arquivo completamente 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, é necessário recarregar o systemd para que ele pare de referenciar 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 principalmente para agrupar diferentes unidades a fim de realizar estados específicos do sistema – semelhante aos runlevels em outros sistemas Init. Os arquivos com o sufixo .target funcionam como pontos de referência que indicam o status de disponibilidade de certas funcionalidades, permitindo que os usuários especifiquem o estado geral desejado em vez das unidades individuais necessárias.

Um exemplo prático é o swap.target, que marca o estado de prontidão do swap. Unidades envolvidas no processo de swap podem ser ajustadas usando opções de configuração como WantedBy= ou RequiredBy= para se alinharem a esse objetivo. Unidades que dependem do swap podem indicar isso por meio de configurações como Wants=, Requires= e After=, para expressar sua dependência e a ordem de inicialização em relação ao swap.

Recuperar e configurar o objetivo padrão

Recuperar e configurar o objetivo padrão permite determinar 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 disponíveis

Para listar todos os objetivos disponí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 instalados em seu sistema. Para cada objetivo, serão mostrados o caminho e o status atual (por exemplo, ativado ou desativado).

Isolar objetivos

Com o comando isolate, você pode ativar todas as unidades associadas a um objetivo específico e, ao mesmo tempo, parar todas as outras unidades não associadas.

Por exemplo, se você estiver trabalhando em um ambiente com o graphical.target ativo e quiser mudar para um modo multiusuário puro sem interface gráfica, você pode isolar o multi-user.target. Isso desativará 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, é recomendável verificar as dependências associadas para evitar a parada indesejada de processos importantes.

$ systemctl list-dependencies multi-user.target
bash

Caso você tenha verificado 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 importantes

Existem objetivos específicos para operações essenciais como desligar ou reiniciar o sistema. No entanto, o systemctl no Linux também oferece atalhos práticos que fornecem funcionalidades adicionais. 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 desligamento, você pode usar poweroff:

$ sudo systemctl poweroff
bash

Para reiniciar o sistema, utilize reboot:

$ sudo systemctl reboot
bash

Esses comandos informam os usuários conectados sobre os eventos iminentes, algo que não é alcançado apenas com a execução ou isolamento de alvos. É importante 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, normalmente o seguinte comando é suficiente:

$ sudo reboot
bash
Este artigo foi útil?
Para melhorar a sua experiência, este site usa cookies. Ao acessar o nosso site, você concorda com nosso uso de cookies. Mais informações
Page top