Linux: systemctl daemon-reload

LinuxBeginner
Pratique Agora

Introdução

Este tutorial irá guiá-lo através do processo de utilização do comando systemctl daemon-reload para gerir daemons e serviços do sistema no seu sistema Linux. O Systemd é o gestor de serviços padrão para a maioria das distribuições Linux modernas, e compreender como atualizar corretamente as configurações dos serviços é uma habilidade essencial para utilizadores e administradores Linux.

Neste laboratório, você aprenderá quando e por que usar o comando systemctl daemon-reload, criar e modificar ficheiros de serviço e aplicar alterações de configuração sem interromper as operações do seu sistema. Ao final deste tutorial, você estará confortável a trabalhar com serviços systemd e a aplicar alterações de configuração de forma eficaz.

Este Lab requer uma ligação à Internet para aprendizagem, portanto, apenas utilizadores Pro podem iniciar a VM. Atualize a sua conta para Pro.

Compreendendo os Fundamentos do systemd e systemctl

O Systemd é o gestor de serviços e sistema para a maioria das distribuições Linux modernas, incluindo o Ubuntu 22.04 que estamos a usar neste laboratório. É responsável por iniciar e gerir os serviços do sistema, e o systemctl é a ferramenta de linha de comando primária usada para interagir com o systemd.

O que é um daemon do sistema?

Um daemon é um processo em segundo plano que é executado continuamente no seu sistema Linux. Estes processos executam várias tarefas, como servir páginas web (Apache, Nginx), gerir bases de dados (MySQL, PostgreSQL) ou lidar com eventos do sistema. O Systemd gere estes daemons através de ficheiros de configuração padronizados chamados "ficheiros de unidade" (unit files).

Comandos básicos do systemctl

Vamos começar por explorar alguns comandos básicos do systemctl para entender o estado atual do seu sistema:

  1. Abra um terminal clicando no ícone Terminal.

  2. Liste todos os serviços do sistema ativos com o seguinte comando:

systemctl list-units --type=service
systemctl list-units --type=service

Este comando exibe todos os serviços atualmente ativos no seu sistema. Você deve ver uma saída semelhante a:

UNIT                                      LOAD   ACTIVE SUB     DESCRIPTION
accounts-daemon.service                   loaded active running Accounts Service
apparmor.service                          loaded active exited  AppArmor initialization
avahi-daemon.service                      loaded active running Avahi mDNS/DNS-SD Stack
...

Pressione Ctrl+C ou Q para sair do comando.

  1. Verifique o estado de um serviço específico, por exemplo, o serviço SSH:
systemctl status ssh
systemctl status ssh

Você deve ver informações detalhadas sobre o serviço SSH, incluindo se está ativo, o seu ID de processo e entradas de registo recentes:

● ssh.service - OpenBSD Secure Shell server
     Loaded: loaded (/lib/systemd/system/ssh.service; enabled; vendor preset: enabled)
     Active: active (running) since Tue 2023-06-13 12:34:56 UTC; 3h 25min ago
       Docs: man:sshd(8)
             man:sshd_config(5)
    Process: 1234 ExecStartPre=/usr/sbin/sshd -t (code=exited, status=0/SUCCESS)
   Main PID: 1235 (sshd)
      Tasks: 1 (limit: 4915)
     Memory: 5.6M
        CPU: 236ms
     CGroup: /system.slice/ssh.service
             └─1235 "sshd: /usr/sbin/sshd -D [listener] 0 of 10-100 startups"
  1. Vamos examinar onde os ficheiros de serviço do systemd são armazenados. Estes são os ficheiros com os quais trabalharemos nos próximos passos:
ls -l /etc/systemd/system/

Este diretório contém ficheiros de unidade de serviço que definem como o systemd gere os serviços. Você deve ver vários ficheiros .service e links simbólicos.

  1. Os ficheiros de unidade fornecidos pelo sistema estão localizados em um diretório diferente. Vamos examiná-los:
ls -l /lib/systemd/system/

Este diretório contém ficheiros de unidade de serviço padrão que vêm com o seu sistema.

Agora que você entende os fundamentos do systemd e como verificar o estado dos serviços, você está pronto para criar e modificar ficheiros de serviço no próximo passo.

Criando um Ficheiro de Serviço Systemd Simples

Neste passo, você criará um ficheiro de serviço systemd simples que executa um script personalizado. Isso ajudará você a entender como os ficheiros de serviço funcionam e como modificá-los.

Criar um script simples

Primeiro, vamos criar um script simples que o nosso serviço irá executar:

  1. Crie um diretório para o seu script:
mkdir -p ~/project/scripts
  1. Use o editor de texto nano para criar um script simples:
nano ~/project/scripts/hello-service.sh
  1. Adicione o seguinte conteúdo ao script:
#!/bin/bash

while true; do
  echo "Hello from custom service: $(date)" >> /tmp/hello-service.log
  sleep 10
done

Pressione Ctrl+X para sair do editor, depois Y para salvar o ficheiro, e depois Enter para confirmar o nome do ficheiro.

Este script simplesmente escreve uma mensagem com a data atual num ficheiro de registo a cada 10 segundos.

  1. Torne o script executável:
chmod +x ~/project/scripts/hello-service.sh

Criar um ficheiro de unidade de serviço systemd

Agora, vamos criar um ficheiro de serviço systemd que irá executar este script:

  1. Crie um novo ficheiro de serviço usando privilégios sudo:
sudo nano /etc/systemd/system/hello-service.service
  1. Adicione o seguinte conteúdo ao ficheiro de serviço:
[Unit]
Description=Hello Service Demo
After=network.target

[Service]
Type=simple
ExecStart=/home/labex/project/scripts/hello-service.sh
Restart=on-failure
User=labex

[Install]
WantedBy=multi-user.target

Vamos entender cada seção deste ficheiro:

  • [Unit]: Contém metadados e dependências

    • Description: Uma descrição legível por humanos do serviço
    • After: Especifica que este serviço deve iniciar após a rede estar pronta
  • [Service]: Define como o serviço deve ser executado

    • Type=simple: O serviço inicia imediatamente
    • ExecStart: O comando a ser executado (o nosso script)
    • Restart: Reinicia automaticamente o serviço se falhar
    • User: A conta de utilizador para executar o serviço
  • [Install]: Define quando e como o serviço deve ser ativado

    • WantedBy: Especifica quando o serviço deve ser iniciado (multi-user.target significa operação normal do sistema)
  1. Salve o ficheiro e saia do editor (pressione Ctrl+X, depois Y, depois Enter no nano).

  2. Vamos examinar o nosso ficheiro de serviço recém-criado:

cat /etc/systemd/system/hello-service.service

Você deve ver o conteúdo que acabou de adicionar ao ficheiro.

cat /etc/systemd/system/hello-service.service

No próximo passo, você aprenderá como carregar e iniciar este serviço usando o comando systemctl daemon-reload.

Usando systemctl daemon-reload para Aplicar Mudanças

Agora que você criou um ficheiro de serviço systemd, precisa informar o systemd sobre este novo serviço. É aqui que o comando systemctl daemon-reload entra em ação.

O que é systemctl daemon-reload?

O comando systemctl daemon-reload instrui o systemd a recarregar todos os ficheiros de serviço e atualizar a sua configuração interna. Isso é necessário sempre que você:

  • Cria um novo ficheiro de serviço
  • Modifica um ficheiro de serviço existente
  • Exclui um ficheiro de serviço

Sem executar este comando, o systemd não reconhecerá as suas alterações.

Recarregar a configuração do systemd

  1. Execute o seguinte comando para recarregar a configuração do systemd:
sudo systemctl daemon-reload

Este comando não produz nenhuma saída quando bem-sucedido, mas atualiza a configuração interna do systemd.

  1. Agora, vamos verificar se o systemd reconhece o nosso novo serviço:
systemctl status hello-service

Você deve ver uma saída mostrando que o serviço está carregado, mas inativo:

● hello-service.service - Hello Service Demo
     Loaded: loaded (/etc/systemd/system/hello-service.service; disabled; vendor preset: enabled)
     Active: inactive (dead)

Iniciar o serviço

  1. Vamos iniciar o nosso serviço:
sudo systemctl start hello-service
  1. Verifique o estado novamente para ver se está a ser executado:
systemctl status hello-service
systemctl status hello-service

Você deve agora ver que o serviço está ativo e a ser executado:

● hello-service.service - Hello Service Demo
     Loaded: loaded (/etc/systemd/system/hello-service.service; disabled; vendor preset: enabled)
     Active: active (running) since [timestamp]; [time] ago
   Main PID: [pid number] (hello-service.sh)
      Tasks: 2 (limit: 4915)
     Memory: 592.0K
        CPU: 5ms
     CGroup: /system.slice/hello-service.service
             └─[pid number] /bin/bash /home/labex/project/scripts/hello-service.sh
  1. Verifique se o nosso serviço está realmente a funcionar, verificando o ficheiro de registo que ele cria:
cat /tmp/hello-service.log

Você deve ver várias linhas de saída semelhantes a:

Hello from custom service: Wed Jun 14 15:30:45 UTC 2023
Hello from custom service: Wed Jun 14 15:30:55 UTC 2023
Hello from custom service: Wed Jun 14 15:31:05 UTC 2023

As entradas de registo mostrarão a data e hora atuais, confirmando que o nosso serviço está a ser executado e a executar o script conforme o esperado.

  1. Habilite o serviço para iniciar automaticamente no momento da inicialização:
sudo systemctl enable hello-service

Você deve ver uma saída semelhante a:

Created symlink /etc/systemd/system/multi-user.target.wants/hello-service.service → /etc/systemd/system/hello-service.service.

Isso significa que o serviço agora está ativado e iniciará automaticamente quando o sistema inicializar.

Agora você criou com sucesso um serviço, usou systemctl daemon-reload para informar o systemd sobre ele e iniciou o serviço. No próximo passo, você modificará o serviço e aplicará as alterações.

Modificando a Configuração do Serviço

Neste passo, você modificará a configuração do seu serviço e aplicará as alterações usando systemctl daemon-reload. Isso demonstrará a importância deste comando ao atualizar configurações de serviço.

Modificar o ficheiro de serviço

Vamos modificar o nosso serviço para alterar a frequência com que ele regista mensagens:

  1. Edite o ficheiro de serviço:
sudo nano /etc/systemd/system/hello-service.service
  1. Adicione uma nova variável de ambiente à seção [Service] para controlar o intervalo de espera. Adicione esta linha após a linha User=labex:
Environment="SLEEP_INTERVAL=5"
  1. Salve e saia do ficheiro (pressione Ctrl+X, depois Y, depois Enter no nano).

  2. Agora, edite o script para usar esta variável de ambiente:

nano ~/project/scripts/hello-service.sh
  1. Modifique o script para usar a variável de ambiente (substitua todo o conteúdo por isto):
#!/bin/bash

## Default to 10 seconds if environment variable is not set
INTERVAL=${SLEEP_INTERVAL:-10}

while true; do
  echo "Hello from custom service: $(date) - Interval: ${INTERVAL}s" >> /tmp/hello-service.log
  sleep $INTERVAL
done
  1. Salve e saia do editor (pressione Ctrl+X, depois Y, depois Enter no nano).

Aplicar as alterações

Agora que você fez alterações tanto no ficheiro de serviço quanto no script, precisa aplicar essas alterações:

  1. Primeiro, recarregue a configuração do systemd:
sudo systemctl daemon-reload
  1. Em seguida, reinicie o serviço para aplicar as alterações:
sudo systemctl restart hello-service
  1. Verifique o estado do serviço:
systemctl status hello-service

Você deve ver que o serviço está a ser executado com a configuração atualizada.

  1. Verifique se as alterações entraram em vigor, verificando o ficheiro de registo:
sleep 15 ## Aguarde para coletar algumas entradas de registo
cat /tmp/hello-service.log | tail -5

Você deve agora ver que o serviço está a registar mensagens a cada 5 segundos em vez de 10, e as entradas de registo devem incluir as novas informações de intervalo:

Hello from custom service: Wed Jun 14 15:45:10 UTC 2023 - Interval: 5s
Hello from custom service: Wed Jun 14 15:45:15 UTC 2023 - Interval: 5s
Hello from custom service: Wed Jun 14 15:45:20 UTC 2023 - Interval: 5s
cat /tmp/hello-service.log | tail -5

Entendendo o que aconteceu

Vamos entender o que acabou de acontecer:

  1. Você modificou o ficheiro de serviço para adicionar uma variável de ambiente.
  2. Você atualizou o script para usar esta variável de ambiente.
  3. Você executou systemctl daemon-reload para informar o systemd sobre as alterações no ficheiro de serviço.
  4. Você reiniciou o serviço para aplicar essas alterações.

Sem o comando systemctl daemon-reload, o systemd não teria reconhecido as alterações no ficheiro de serviço, e a variável de ambiente não teria sido passada para o script ao reiniciar o serviço.

Isso demonstra por que systemctl daemon-reload é essencial sempre que você modifica ficheiros de serviço - ele garante que o systemd esteja ciente das suas alterações antes de tentar aplicá-las, iniciando ou reiniciando serviços.

Solução de Problemas e Melhores Práticas

Neste passo final, você aprenderá sobre problemas comuns que podem ocorrer ao trabalhar com serviços systemd e como solucioná-los. Você também aprenderá algumas melhores práticas para trabalhar com systemctl daemon-reload.

Solução de problemas comuns

1. Serviço falha ao iniciar

Se o seu serviço falhar ao iniciar, o primeiro passo é verificar o seu estado:

systemctl status hello-service

Isso geralmente fornece informações detalhadas sobre o erro. Vamos intencionalmente criar um erro para ver como solucioná-lo:

  1. Edite o ficheiro de serviço:
sudo nano /etc/systemd/system/hello-service.service
  1. Altere a linha ExecStart para apontar para um script inexistente:
ExecStart=/home/labex/project/scripts/non-existent.sh
  1. Salve e saia do editor.

  2. Recarregue a configuração do systemd e tente reiniciar o serviço:

sudo systemctl daemon-reload
sudo systemctl restart hello-service
  1. Verifique o estado para ver o erro:
systemctl status hello-service

Você deve ver mensagens de erro indicando que o script não existe:

● hello-service.service - Hello Service Demo
     Loaded: loaded (/etc/systemd/system/hello-service.service; enabled; vendor preset: enabled)
     Active: failed (Result: exit-code) since [timestamp]; [time] ago
    Process: [pid] ExecStart=/home/labex/project/scripts/non-existent.sh (code=exited, status=203/EXEC)
   Main PID: [pid] (code=exited, status=203/EXEC)
        CPU: 5ms

[timestamp] systemd[1]: Started Hello Service Demo.
[timestamp] systemd[pid]: hello-service.service: Failed to execute command: No such file or directory
[timestamp] systemd[pid]: hello-service.service: Failed at step EXEC spawning /home/labex/project/scripts/non-existent.sh: No such file or directory
[timestamp] systemd[1]: hello-service.service: Main process exited, code=exited, status=203/EXEC
[timestamp] systemd[1]: hello-service.service: Failed with result 'exit-code'.
  1. Corrija o ficheiro de serviço para apontar de volta para o script correto:
sudo nano /etc/systemd/system/hello-service.service
  1. Altere a linha ExecStart de volta para:
ExecStart=/home/labex/project/scripts/hello-service.sh
  1. Salve e saia, depois recarregue e reinicie:
sudo systemctl daemon-reload
sudo systemctl restart hello-service
  1. Verifique se o serviço está a ser executado novamente:
systemctl status hello-service

2. Lendo os registos do journal para obter mais informações

Ao solucionar problemas, você pode usar journalctl para visualizar registos detalhados:

sudo journalctl -u hello-service

Isso mostra todos os registos para a unidade hello-service, o que pode ser inestimável para diagnosticar problemas.

Para ver apenas os registos mais recentes:

sudo journalctl -u hello-service -n 20

Para acompanhar os registos em tempo real (semelhante a tail -f):

sudo journalctl -u hello-service -f

Pressione Ctrl+C para sair do modo de acompanhamento de registos.

Melhores práticas para trabalhar com systemctl daemon-reload

Aqui estão algumas melhores práticas a serem seguidas ao trabalhar com systemd e o comando daemon-reload:

  1. Sempre recarregar após as alterações: Sempre execute systemctl daemon-reload após modificar, adicionar ou remover quaisquer ficheiros de unidade systemd.

  2. Verificar a sintaxe antes de aplicar: Você pode usar o seguinte comando para verificar erros de sintaxe nos seus ficheiros de serviço antes de recarregar:

sudo systemd-analyze verify /etc/systemd/system/hello-service.service

Se não houver erros, este comando não produz nenhuma saída. Quaisquer erros de sintaxe serão relatados.

  1. Usar modelos de serviço: Para serviços que exigem várias instâncias, use modelos de serviço (ficheiros nomeados como service@.service) para evitar duplicação.

  2. Rever as dependências do serviço: Certifique-se de que seus serviços tenham as diretivas After= e Requires= corretas para garantir que eles iniciem na ordem correta.

  3. Limpar corretamente: Ao remover um serviço, certifique-se de pará-lo e desativá-lo antes de excluir o ficheiro de serviço:

sudo systemctl stop hello-service
sudo systemctl disable hello-service
sudo rm /etc/systemd/system/hello-service.service
sudo systemctl daemon-reload

Vamos limpar o nosso serviço de exemplo agora:

sudo systemctl stop hello-service
sudo systemctl disable hello-service

Você deve ver uma saída indicando que o symlink foi removido:

Removed /etc/systemd/system/multi-user.target.wants/hello-service.service.

Não vamos excluir o ficheiro de serviço ainda, pois ainda precisamos dele para verificação.

Agora você entende como criar, modificar e solucionar problemas de serviços systemd, bem como a importância do comando systemctl daemon-reload na gestão desses serviços.

Resumo

Neste laboratório, você aprendeu como usar o comando systemctl daemon-reload para gerenciar daemons e serviços do sistema no seu sistema Linux. Você:

  • Entendeu os conceitos básicos do systemd e systemctl
  • Criou um ficheiro de serviço systemd personalizado
  • Usou systemctl daemon-reload para aplicar alterações às configurações do serviço
  • Modificou ficheiros de serviço e aplicou essas alterações
  • Aprendeu a solucionar problemas comuns e a seguir as melhores práticas

O comando systemctl daemon-reload é essencial ao trabalhar com serviços systemd, pois garante que o gerenciador systemd esteja ciente de quaisquer alterações que você faça nas configurações do serviço. Sem este comando, as suas alterações nos ficheiros de serviço não seriam reconhecidas pelo sistema até a próxima reinicialização.

Este conhecimento será valioso à medida que você continuar a trabalhar com sistemas Linux, permitindo que você gerencie serviços de forma eficaz e garanta que as suas alterações de configuração sejam aplicadas corretamente.