Service Management em Systemd

Abrange workflows systemctl para iniciar, ativar, monitorar e personalizar serviços systemd.

Os serviços em um sistema Oracle Linux são gerenciados pelo comando systemctl subcommand.

Exemplos de subcomandos são enable, disable, stop, start, restart, reload e status.

Para obter mais informações, consulte a página do manual systemctl(1).

Iniciando e Interrompendo Serviços

Mostra os comandos systemctl start e systemctl stop e explica como as alterações de estado persistem.

Para iniciar um serviço, use o comando systemctl start:

sudo systemctl start sshd

Para interromper um serviço, use o comando systemctl stop:

sudo systemctl stop sshd

A alteração do estado de um serviço só dura enquanto o sistema permanece no mesmo estado.

Se você interromper um serviço e, em seguida, alterar o destino de estado do sistema para um em que o serviço esteja configurado para ser executado (por exemplo, reinicializando o sistema), o serviço será reiniciado. Da mesma forma, iniciar um serviço não permite que o serviço seja iniciado após uma reinicialização. Consulte Ativando e Desativando Serviços.

Ativando e Desativando Serviços

Explica como ativar, desativar, mascarar e desmascarar serviços para que eles sejam iniciados (ou permaneçam parados) nas reinicializações.

Você pode usar o comando systemctl para ativar ou desativar um serviço do início quando o sistema for inicializado, por exemplo:

sudo systemctl enable httpd
Created symlink /etc/systemd/system/multi-user.target.wants/httpd.service → /usr/lib/systemd/system/httpd.service.

O comando enable ativa um serviço criando um link simbólico para o destino de estado do sistema de nível mais baixo no qual o serviço é iniciado. No exemplo anterior, o comando cria o link simbólico httpd.service para o destino multi-user.

Observação

Para iniciar o serviço ao mesmo tempo em que você o ativa, inclua a opção --now no comando. Por exemplo: sudo systemctl enable --now httpd

A desativação de um serviço remove o link simbólico:

sudo systemctl disable httpd
Removed /etc/systemd/system/multi-user.target.wants/httpd.service.

Para verificar se um serviço está ativado, use o subcomando is-enabled, conforme mostrado nos seguintes exemplos:

systemctl is-enabled httpd
disabled
systemctl is-enabled sshd
enabled

Depois de executar o comando systemctl disable, o serviço ainda pode ser iniciado ou interrompido por contas de usuário, scripts e outros processos.

No entanto, se você precisar garantir que o serviço não possa ser iniciado inadvertidamente, por exemplo, por um serviço em conflito, use o comando systemctl mask da seguinte forma:

sudo systemctl mask httpd
Created symlink from '/etc/systemd/system/multi-user.target.wants/httpd.service' to '/dev/null'

O comando mask define a referência de serviço como /dev/null. Se você tentar iniciar um serviço que foi mascarado, receberá um erro conforme mostrado no seguinte exemplo:

sudo systemctl start httpd
Failed to start httpd.service: Unit is masked.

Para revincular a referência de serviço de volta ao arquivo de configuração da unidade de serviço correspondente, use o comando systemctl unmask:

sudo systemctl unmask httpd

Para obter mais informações, consulte a página do manual systemctl(1).

Exibindo o Status dos Serviços

Detalha os comandos systemctl is-active e status para verificar a integridade do serviço e os grupos de controle.

Para verificar se um serviço está em execução, use o subcomando is-active. A saída seria ativa ou inativa, conforme mostrado nos seguintes exemplos:

systemctl is-active httpd
active
systemctl is-active sshd
inactive

O subcomando status fornece um resumo detalhado do status de um serviço, incluindo uma árvore que exibe as tarefas no grupo de controle (CGroup) que o serviço implementa:

systemctl status httpd
httpd.service - The Apache HTTP Server
   Loaded: loaded (/usr/lib/systemd/system/httpd.service; enabled; vendor preset: disabled)
   Active: active (running) since ...
     Docs: man:httpd.service(8)
 Main PID: 11832 (httpd)
   Status: "Started, listening on: port 80"
    Tasks: 213 (limit: 26213)
   Memory: 32.5M
   CGroup: /system.slice/httpd.service
           ├─11832 /usr/sbin/httpd -DFOREGROUND
           ├─11833 /usr/sbin/httpd -DFOREGROUND
           ├─11834 /usr/sbin/httpd -DFOREGROUND
           ├─11835 /usr/sbin/httpd -DFOREGROUND
           └─11836 /usr/sbin/httpd -DFOREGROUND

Jul 17 00:14:32 Unknown systemd[1]: Starting The Apache HTTP Server...
Jul 17 00:14:32 Unknown httpd[11832]: Server configured, listening on: port 80
Jul 17 00:14:32 Unknown systemd[1]: Started The Apache HTTP Server.

cgroup é um conjunto de processos que são vinculados para que você possa controlar seu acesso aos recursos do sistema. No exemplo, o cgroup para o serviço httpd é httpd.service, que está no segmento system.

As fatias dividem o cgroups em um sistema em categorias diferentes. Para exibir a hierarquia de segmentos e cgroup, utilize o comando systemd-cgls:

systemd-cgls
Control group /:
-.slice
├─user.slice
│ └─user-1000.slice
│   ├─user@1000.service
│   │ └─init.scope
│   │   ├─6488 /usr/lib/systemd/systemd --user
│   │   └─6492 (sd-pam)
│   └─session-7.scope
│     ├─6484 sshd: root [priv]
│     ├─6498 sshd: root@pts/0
│     ├─6499 -bash
│     ├─6524 sudo systemd-cgls
│     ├─6526 systemd-cgls
│     └─6527 less
├─init.scope
│ └─1 /usr/lib/systemd/systemd --switched-root --system --deserialize 16
└─system.slice
  ├─rngd.service
  │ └─1266 /sbin/rngd -f --fill-watermark=0
  ├─irqbalance.service
  │ └─1247 /usr/sbin/irqbalance --foreground
  ├─libstoragemgmt.service
  │ └─1201 /usr/bin/lsmd -d
  ├─systemd-udevd.service
  │ └─1060 /usr/lib/systemd/systemd-udevd
  ├─polkit.service
  │ └─1241 /usr/lib/polkit-1/polkitd --no-debug
  ├─chronyd.service
  │ └─1249 /usr/sbin/chronyd
  ├─auditd.service
  │ ├─1152 /sbin/auditd
  │ └─1154 /usr/sbin/sedispatch
  ├─tuned.service
  │ └─1382 /usr/libexec/platform-python -Es /usr/sbin/tuned -l -P
  ├─systemd-journald.service
  │ └─1027 /usr/lib/systemd/systemd-journald
  ├─atd.service
  │ └─1812 /usr/sbin/atd -f
  ├─sshd.service
  │ └─1781 /usr/sbin/sshd

O system.slice contém serviços e outros processos do sistema. O user.slice contém processos do usuário, que são executados em cgroups transitórios chamados escopos.

No exemplo, os processos para o usuário com o ID 1000 estão em execução no escopo session-7.scope no segmento /user.slice/user-1000.slice.

Você pode usar o comando systemctl para limitar a CPU, Entrada/Saída, memória e outros recursos disponíveis para os processos em grupos de serviço e escopo. Consulte Controlando o Acesso a Recursos do Sistema.

Para obter mais informações, consulte as páginas do manual systemctl(1) e systemd-cgls(1). Consulte também Usando o Systemd para Gerenciar Grupos de Controle.

Controlando o Acesso aos Recursos do Sistema

Mostra como usar systemctl set-property e systemd-run para atribuir limites de CPU e memória a serviços e escopos.

Use o comando systemctl para controlar o acesso de um cgroup aos recursos do sistema, por exemplo:

sudo systemctl [--runtime] set-property httpd CPUShares=512 MemoryLimit=1G

CPUShare controla o acesso aos recursos da CPU. Como o valor padrão é 1024, um valor de 512 reduz pela metade o acesso ao tempo de CPU que os processos no cgroup têm. Da mesma forma, MemoryLimit controla a quantidade máxima de memória que o cgroup pode usar.

Observação

Não é necessário especificar a extensão .service para o nome de um serviço.

Se você especificar a opção --runtime, a configuração não persistirá nas reinicializações do sistema.

Como alternativa, você pode alterar as definições de recursos de um serviço no cabeçalho [Service] no arquivo de configuração do serviço em /usr/lib/systemd/system. Após editar o arquivo, faça com que systemd recarregue seus arquivos de configuração e reinicie o serviço:

sudo systemctl daemon-reload
sudo systemctl restart service

Você pode executar comandos gerais dentro de escopos e usar systemctl para controlar o acesso que esses cgroups transitórios têm aos recursos do sistema. Para executar um comando dentro de um escopo, use o comando systemd-run:

sudo systemd-run --scope --unit=group_name.scope [--slice=slice_name]

Se não desejar criar o grupo no segmento system padrão, é possível especificar outro segmento ou o nome de um novo segmento. O exemplo a seguir executa um comando chamado mymonitor em mymon.scope sob myslice.slice:

sudo systemd-run --scope --unit=mymon.scope --slice=myslice mymonitor
Running as unit mymon.scope.
Observação

Se você não especificar a opção --scope, o grupo de controle será criado como um serviço em vez de como um escopo.

Você pode, então, usar systemctl para controlar o acesso que um escopo tem aos recursos do sistema da mesma forma que para um serviço. No entanto, ao contrário de um serviço, você deve especificar a extensão .scope, por exemplo:

sudo systemctl --runtime set-property mymon.scope CPUShares=256

Para obter mais informações, consulte Usando o Systemd para Gerenciar Grupos de Controle e as páginas manuais systemctl(1), systemd-cgls(1) e systemd.resource-control(5).

Criando um Serviço systemd Baseado em Usuário

Além dos arquivos systemd no âmbito do sistema, o systemd permite criar serviços baseados no usuário que você pode executar em um nível de usuário sem exigir acesso e privilégios root. Esses serviços baseados em usuário estão sob controle do usuário e são configuráveis, independentes dos serviços do sistema.

Veja a seguir alguns recursos distintivos dos serviços systemd baseados no usuário:

  • Os serviços systemd baseados no usuário são vinculados a uma conta de usuário específica.
  • Eles são criados no diretório home do usuário associado em $HOME/.config/systemd/user/.
  • Depois que esses serviços forem ativados, eles serão iniciados quando o usuário associado fizer log-in. Esse comportamento difere do dos serviços systemd ativados que são iniciados quando o sistema é inicializado.

Esse recurso é especialmente útil ao criar serviços de contêiner Podman. Para obter mais informações sobre o Podman, consulte o Oracle Linux: Podman User's Guide.

Para criar um serviço baseado em usuário:

  1. Crie o arquivo de unidade do serviço no diretório $HOME/.config/systemd/user, por exemplo:
    touch $HOME/.config/systemd/user/myservice.service
  2. Abra o arquivo de unidade e especifique os valores para as opções que você deseja usar, como Description, ExecStart, WantedBy e assim por diante.
    Para referência, consulte Opções Configuráveis em Arquivos de Unidade de Serviço e as páginas de manual systemd.service(5) e systemd.unit(5).
  3. Ative o serviço para ser iniciado automaticamente quando você fizer login.
    systemctl --user enable myservice.service
    Observação

    Quando você faz logout, o serviço é interrompido, a menos que o usuário raiz tenha ativado processos para continuar a ser executado para o usuário.

    Consulte https://docs.oracle.com/en/learn/ol-systemd/ para obter mais informações.

  4. Inicie o serviço.
    systemctl --user start myservice.service
  5. Verifique se o serviço está em execução.
    systemctl --user status myservice.service

Alterando Arquivos de Unidade de Serviço systemd

Descreve como substituir arquivos de unidade empacotados e criar snippets drop-in em /etc/systemd/system.

Para alterar a configuração dos serviços systemd, copie os arquivos com as extensões .service, .target, .mount e .socket de /usr/lib/systemd/system para /etc/systemd/system.

Após ter copiado os arquivos, você poderá editar as versões em /etc/systemd/system.

Os arquivos do /etc/systemd/system têm precedência sobre as versões do /usr/lib/systemd/system. Os arquivos no /etc/systemd/system não são substituídos quando você atualiza um pacote que toca em arquivos no /usr/lib/systemd/system.

Para reverter para a configuração padrão do systemd de um serviço específico, você pode renomear ou excluir as cópias no /etc/systemd/system.

Outra abordagem para alterar a configuração de um serviço é criar um arquivo drop-in. Com esta abordagem, você pode preservar a unidade original enquanto altera parâmetros específicos da unidade.

Crie arquivos drop-in em /etc/systemd/system/unit_name.d/, onde o diretório unit_name.d é uma unidade existente, em seguida, dê aos arquivos drop-in uma extensão de arquivo .conf.

Por exemplo: /etc/systemd/system/unit_name.d/name_of_drop-in.conf. systemd lê o arquivo .conf e aplica as configurações à unidade original.

As seções a seguir descrevem as diferentes partes de um arquivo de unidade de serviço que você pode editar e personalizar para um sistema.

Sobre Arquivos da Unidade de Serviço

Os serviços são executados com base em seus arquivos de unidade de serviço correspondentes. Um arquivo de unidade de serviço geralmente contém as seguintes seções, com cada seção tendo suas respectivas opções definidas que determinam como um serviço específico é executado:

[Unit]

Contém informações sobre o serviço.

[UnitType]:

Contém opções específicas para o tipo de unidade do arquivo. Por exemplo, em um arquivo de unidade de serviço, esta seção é intitulada [Service] e contém opções específicas para unidades do tipo de serviço, como ExecStart ou StandardOutput.

Apenas os tipos de unidade que oferecem opções específicas ao tipo têm essa seção.

[Install]

Contém informações de instalação para a unidade específica. As informações nesta seção são usadas pelos comandos systemctl enable e systemctl disable.

Um arquivo de unidade de serviço pode conter as seguintes configurações para um serviço.

[Unit]
Description=A test service used to develop a service unit file template

[Service]
Type=simple
StandardOutput=journal
ExecStart=/usr/lib/systemd/helloworld.sh

[Install]
WantedBy=default.target

Opções Configuráveis em Arquivos de Unidade de Serviço descreve algumas opções configuradas comumente usadas disponíveis em cada seção. Uma lista completa também está disponível nas páginas de manual systemd.service(5) e systemd.unit(5).

Opções Configuráveis nos Arquivos de Unidade de Serviço

Cada uma das listas a seguir trata de uma seção separada do arquivo de unidade de serviço.

Descrição das Opções na Seção [Unidade]

A lista a seguir fornece uma visão geral das opções configuráveis comumente usadas disponíveis na seção [Unit] do arquivo de unidade de serviço:

Description

Fornece informações sobre o serviço. As informações são exibidas quando você executa o comando systemctl status na unidade.

Documentation

Contém uma lista separada por espaços de URIs que fazem referência à documentação desta unidade ou à sua configuração.

After

Configura a unidade para ser executada somente depois que as unidades listadas na opção terminarem de ser iniciadas.

No exemplo a seguir, se o arquivo var3.service tiver a seguinte entrada, ele só será iniciado depois que as unidades var1.service e var2.service tiverem sido iniciadas:

 After=var1.service var2.service
Requires

Configura uma unidade para ter dependências de exigências em outras unidades. Se uma unidade for ativada, as listadas em sua opção Requires também serão ativadas.

Wants

Uma versão menos rigorosa da opção Requires. Por exemplo, uma unidade específica pode ser ativada mesmo que uma das listadas em sua opção Wants não seja iniciada.

Descrição das Opções na Seção [Serviço]

Esta lista a seguir fornece uma visão geral das opções configuráveis comumente usadas disponíveis na seção [Service] de um arquivo de unidade de serviço.

Type

Configura o tipo de inicialização do processo para a unidade de serviço.

Por padrão, o valor desse parâmetro é simple, o que indica que o processo principal do serviço é o iniciado pelo parâmetro ExecStart.

Geralmente, se o tipo de um serviço for simple, a definição poderá ser omitida do arquivo.

StandardOutput
Configura como os eventos do serviço são registrados. Por exemplo, considere que um arquivo de unidade de serviço tenha a seguinte entrada:
StandardOutput=journal

No exemplo, o valor journal indica que os eventos são registrados no diário, que pode ser exibido com o uso do comando journalctl.

ExecStart

Especifica o caminho completo e o comando que inicia o serviço, por exemplo, /usr/bin/npm start.

ExecStop

Especifica os comandos a serem executados para interromper o serviço iniciado por meio do ExecStart.

ExecReload

Especifica os comandos a serem executados para acionar um recarregamento de configuração no serviço.

Restart

Configura se o serviço deve ser reiniciado quando o processo de serviço sair, for interrompido ou quando um timeout for atingido.

Observação

Essa opção não se aplica quando o processo é interrompido corretamente por uma operação systemd, por exemplo, um systemctl stop ou systemctl restart. Nesses casos, o serviço não é reiniciado por esta opção de configuração.
RemainAfterExit

Um valor booliano que configura se o serviço deve ser considerado ativo mesmo quando todos os seus processos foram encerrados. O valor padrão é no.

Descrição das opções na seção [Instalar]

Esta lista a seguir fornece uma visão geral das opções configuráveis comumente usadas disponíveis na seção [Install] do arquivo de unidade de serviço.

Alias

Uma lista de nomes separados por espaço de uma unidade.

No momento da instalação, systemctl enable cria symlinks desses nomes para o nome do arquivo da unidade.

Os aliases só são efetivos quando a unidade é ativada.

RequiredBy

Configura o serviço a ser exigido por outras unidades.

Por exemplo, considere um arquivo de unidade var1.service que tenha a seguinte configuração adicionada a ele:

RequiredBy=var2.service var3.service

Quando var1.service está ativado, var2.service e var3.service recebem uma dependência Requires em relação a var1.service. Essa dependência é definida por um link simbólico que é criado na pasta .requires de cada serviço dependente (var2.service e var3.service) que aponta para o arquivo de unidade do sistema var1.service.

WantedBy

Especifica uma lista de unidades às quais será concedida uma dependência wants do serviço cujo arquivo você está editando.

Por exemplo, considere um arquivo de unidade var1.service que tenha a seguinte configuração adicionada a ele:

WantedBy=var2.service var3.service

Quando var1.service está ativado, var2.service e var3.service recebem uma dependência Wants em var1.service. Essa dependência é definida por um link simbólico que é criado na pasta ".wants" de cada serviço dependente (var2.service e var3.service) que aponta para o arquivo de unidade do sistema para var1.service.

Also

Lista as unidades adicionais a serem instaladas ou removidas quando a unidade for instalada ou removida.

DefaultInstance

A opção DefaultInstance se aplica somente a arquivos de unidade de modelo.

Os arquivos de unidade de modelo permitem a criação de várias unidades a partir de um único arquivo de configuração. A opção DefaultInstance especifica a instância para a qual a unidade está ativada se o modelo estiver ativado sem qualquer instância definida explicitamente.

Criando um Arquivo Drop-In de Unidade

Você pode usar o comando systemctl edit para gerar automaticamente um arquivo de unidade systemd ou drop-in para qualquer unidade systemd existente. Você pode usar o arquivo suspenso para substituir a configuração base de uma unidade ou para estender os requisitos de um arquivo de unidade.

  1. Execute o comando systemctl edit <unit> para gerar automaticamente um arquivo drop-in systemd e abrir o arquivo no editor padrão do sistema.

    Por exemplo, para editar a unidade cockpit.socket para alterar a porta que a console web do Cockpit ouve, você pode fazer o seguinte:

    sudo systemctl edit cockpit.socket --drop-in=listen.conf

    A opção --drop-in permite que você especifique o nome do arquivo usado para o arquivo drop-in. Se você não especificar essa opção, o nome do arquivo padrão será definido como override.conf.

    O editor de texto do sistema é aberto e você pode adicionar as linhas para substituir a configuração padrão:

    [Socket]
    ListenStream=
    ListenStream=443
    Observação

    É necessária mais configuração fora do systemd se você alterar a porta de listener padrão do Cockpit. Por exemplo, pode ser necessário alterar os contextos do SELinux e a configuração do firewall.
  2. Salve o arquivo drop-in ou saia.
    Se você salvar as alterações no arquivo drop-in, o arquivo será instalado automaticamente no /etc/systemd/system/<unit>.d/<drop-in.file>. Se você sair do editor sem salvar as alterações, o arquivo não será criado e nenhuma atualização adicional será necessária.
  3. Recarregue a configuração do daemon systemd.
    sudo systemctl daemon-reload
  4. Reinicie a unidade systemd que você atualizou.

    Por exemplo, para reiniciar o cockpit.socket usado neste exemplo, execute:

    sudo systemctl restart cockpit.socket