Решение проблем и рекомендации по использованию наилучших практик
В этом финальном шаге вы узнаете о распространенных проблемах, которые могут возникнуть при работе с службами systemd, и о том, как их устранять. Также вы узнаете о некоторых наилучших практиках при работе с командой systemctl daemon-reload
.
Решение распространенных проблем
1. Служба не запускается
Если ваша служба не запускается, первым шагом является проверка ее статуса:
systemctl status hello-service
Это часто предоставляет подробную информацию об ошибке. Давайте намеренно создадим ошибку, чтобы увидеть, как ее устранять:
- Отредактируйте файл службы:
sudo nano /etc/systemd/system/hello-service.service
- Измените строку
ExecStart
, чтобы она указывала на несуществующий сценарий:
ExecStart=/home/labex/project/scripts/non-existent.sh
-
Сохраните и закройте редактор.
-
Перезагрузите конфигурацию systemd и попытайтесь перезапустить службу:
sudo systemctl daemon-reload
sudo systemctl restart hello-service
- Проверьте статус, чтобы увидеть ошибку:
systemctl status hello-service
Вы должны увидеть сообщения об ошибке, указывающие на то, что сценарий не существует:
● 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'.
- Исправьте файл службы, чтобы он снова указывал на правильный сценарий:
sudo nano /etc/systemd/system/hello-service.service
- Верните строку
ExecStart
обратно:
ExecStart=/home/labex/project/scripts/hello-service.sh
- Сохраните и закройте, затем перезагрузите и перезапустите:
sudo systemctl daemon-reload
sudo systemctl restart hello-service
- Проверьте, запущена ли служба снова:
systemctl status hello-service
2. Чтение журналов для получения дополнительной информации
При устранении неполадок вы можете использовать journalctl
, чтобы просматривать подробные журналы:
sudo journalctl -u hello-service
Это показывает все журналы для единицы hello-service, которые могут быть бесценны при диагностике проблем.
Для просмотра только самых последних журналов:
sudo journalctl -u hello-service -n 20
Для просмотра журналов в режиме реального времени (похоже на tail -f
):
sudo journalctl -u hello-service -f
Нажмите Ctrl+C
, чтобы выйти из режима просмотра журналов.
Наилучшие практики при работе с systemctl daemon-reload
Вот некоторые наилучшие практики при работе с systemd и командой daemon-reload
:
-
Всегда перезагружайте после изменений: Всегда запускайте systemctl daemon-reload
после изменения, добавления или удаления любых файлов единиц systemd.
-
Проверяйте синтаксис перед применением: Вы можете использовать следующую команду, чтобы проверить наличие синтаксических ошибок в файлах служб перед перезагрузкой:
sudo systemd-analyze verify /etc/systemd/system/hello-service.service
Если ошибок нет, эта команда не выводит никаких сообщений. Любые синтаксические ошибки будут отчетываться.
-
Используйте шаблоны служб: Для служб, которые требуют нескольких экземпляров, используйте шаблоны служб (файлы с именем вида [email protected]
), чтобы избежать дублирования.
-
Проверяйте зависимости служб: Убедитесь, что ваши службы имеют правильные директивы After=
и Requires=
, чтобы обеспечить их запуск в правильном порядке.
-
Корректно удаляйте службы: При удалении службы убедитесь, что вы останавливаете ее и отключаете перед удалением файла службы:
sudo systemctl stop hello-service
sudo systemctl disable hello-service
sudo rm /etc/systemd/system/hello-service.service
sudo systemctl daemon-reload
Очистим наш пример службы сейчас:
sudo systemctl stop hello-service
sudo systemctl disable hello-service
Вы должны увидеть вывод, указывающий на то, что символическая ссылка была удалена:
Removed /etc/systemd/system/multi-user.target.wants/hello-service.service.
Мы пока не удалим файл службы, так как мы по-прежнему нуждаемся в нем для проверки.
Теперь вы понимаете, как создавать, изменять и устранять неполадки в службах systemd, а также важность команды systemctl daemon-reload
при управлении этими службами.