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
:
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:
Para iniciar, por exemplo, o servidor web Apache, você digitaria:
Se você deseja parar um serviço em execução, use stop
:
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
:
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:
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.
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
:
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.
Para impedir que um serviço inicie automaticamente durante a inicialização do sistema, use o comando disable
:
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
:
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:
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.
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.
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:
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
ouerror
. - ACTIVE: O status de atividade da unidade; pode assumir valores como
active
,inactive
,activating
oudeactivating
. - 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 derunning
,exited
oufailed
. - 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
.:
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.
Com o filtro --type=
, você pode exibir apenas determinados tipos de unidades, como, por exemplo, exibir exclusivamente unidades de serviço ativas.
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.
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:
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:
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
:
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
.
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:
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
:
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
:
Uma unidade de arquivo completamente revisada pode ser excluída com o seguinte comando:
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.
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:
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:
Listar objetivos disponíveis
Para listar todos os objetivos disponíveis em seu sistema, você pode usar o seguinte comando:
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.
Caso você tenha verificado e esteja de acordo com as unidades ativas que deseja manter, pode isolar o objetivo desejado:
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
:
Com halt
, você pode parar o sistema:
Para um completo desligamento, você pode usar poweroff
:
Para reiniciar o sistema, utilize reboot
:
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: