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:
- Edite o ficheiro de serviço:
sudo nano /etc/systemd/system/hello-service.service
- Altere a linha
ExecStart para apontar para um script inexistente:
ExecStart=/home/labex/project/scripts/non-existent.sh
-
Salve e saia do editor.
-
Recarregue a configuração do systemd e tente reiniciar o serviço:
sudo systemctl daemon-reload
sudo systemctl restart hello-service
- 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'.
- Corrija o ficheiro de serviço para apontar de volta para o script correto:
sudo nano /etc/systemd/system/hello-service.service
- Altere a linha
ExecStart de volta para:
ExecStart=/home/labex/project/scripts/hello-service.sh
- Salve e saia, depois recarregue e reinicie:
sudo systemctl daemon-reload
sudo systemctl restart hello-service
- Verifique se o serviço está a ser executado novamente:
systemctl status hello-service
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:
-
Sempre recarregar após as alterações: Sempre execute systemctl daemon-reload após modificar, adicionar ou remover quaisquer ficheiros de unidade systemd.
-
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.
-
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.
-
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.
-
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.