Введение
В этом руководстве вы узнаете, как использовать команду systemctl daemon-reload для управления системными демонами и службами в системе Linux. Systemd является стандартным менеджером служб для большинства современных дистрибутивов Linux, и понимание того, как правильно обновлять конфигурации служб, является важным навыком для пользователей и администраторов Linux.
В этом практическом занятии (лабораторной работе) вы узнаете, когда и почему нужно использовать команду systemctl daemon-reload, создавать и изменять файлы служб, а также применять изменения конфигурации без нарушения работы системы. По завершении этого руководства вы будете уверенно работать с службами systemd и эффективно применять изменения конфигурации.
Для этого LabEx требуется подключение к интернету для обучения, поэтому запустить виртуальную машину могут только пользователи LabEx Pro. Перейдите на тариф Pro.
Введение в основы systemd и systemctl
Systemd - это менеджер служб и системы для большинства современных дистрибутивов Linux, в том числе и Ubuntu 22.04, который мы используем в этом практическом занятии. Он отвечает за запуск и управление системными службами, а systemctl - это основная командная строка для взаимодействия с systemd.
Что такое системный демон?
Демон - это фоновый процесс, который постоянно работает на вашей системе Linux. Эти процессы выполняют различные задачи, такие как обслуживание веб-страниц (Apache, Nginx), управление базами данных (MySQL, PostgreSQL) или обработка системных событий. Systemd управляет этими демонами с помощью стандартизированных конфигурационных файлов, называемых "файлами единиц".
Основные команды systemctl
Прежде всего, рассмотрим некоторые базовые команды systemctl, чтобы понять текущее состояние вашей системы:
Откройте терминал, нажав на значок Терминал.
Список всех активных системных служб можно получить с помощью следующей команды:
systemctl list-units --type=service

Эта команда отображает все текущие активные службы на вашей системе. Вы должны увидеть вывод, похожий на:
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
...
Нажмите Ctrl+C или Q, чтобы выйти из команды.
- Проверить статус определенной службы, например, службы SSH:
systemctl status ssh

Вы должны увидеть подробную информацию о службе SSH, включая то, активна ли она, ее идентификатор процесса и недавние записи журнала:
● 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"
- Теперь посмотрим, где хранятся файлы служб systemd. Именно с этими файлами мы будем работать в следующих шагах:
ls -l /etc/systemd/system/
В этой директории находятся файлы единиц служб, которые определяют, как systemd управляет службами. Вы должны увидеть несколько файлов .service и символические ссылки.
- Системно предоставляемые файлы единиц находятся в другой директории. Посмотрим на них:
ls -l /lib/systemd/system/
В этой директории находятся стандартные файлы единиц служб, которые поставляются с вашей системой.
Теперь, когда вы понимаете основы systemd и как проверять статус служб, вы готовы создавать и изменять файлы служб на следующем шаге.
Создание простого файла службы systemd
В этом шаге вы создадите простой файл службы systemd, который запускает пользовательский сценарий. Это поможет вам понять, как работают файлы служб и как их изменять.
Создание простого сценария
Сначала создадим простой сценарий, который будет запускаться нашей службой:
- Создайте директорию для вашего сценария:
mkdir -p ~/project/scripts
- Используйте текстовый редактор
nanoдля создания простого сценария:
nano ~/project/scripts/hello-service.sh
- Добавьте следующее содержимое в сценарий:
#!/bin/bash
while true; do
echo "Hello from custom service: $(date)" >> /tmp/hello-service.log
sleep 10
done
Нажмите Ctrl+X, чтобы выйти из редактора, затем Y, чтобы сохранить файл, а затем Enter, чтобы подтвердить имя файла.
Этот сценарий просто записывает сообщение с текущей датой в файл журнала каждые 10 секунд.
- Сделайте сценарий исполняемым:
chmod +x ~/project/scripts/hello-service.sh
Создание файла единицы службы systemd
Теперь создадим файл службы systemd, который будет запускать этот сценарий:
- Создайте новый файл службы с правами
sudo:
sudo nano /etc/systemd/system/hello-service.service
- Добавьте следующее содержимое в файл службы:
[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
Рассмотрим каждую секцию этого файла:
[Unit]: Содержит метаданные и зависимости
Description: Читабельное описание службыAfter: Указывает, что эта служба должна запускаться после того, как сеть будет готова
[Service]: Определяет, как должна запускаться служба
Type=simple: Служба запускается сразуExecStart: Команда для запуска (наш сценарий)Restart: Автоматически перезапускает службу, если она завершилась с ошибкойUser: Пользовательский аккаунт, под которым будет запускаться служба
[Install]: Определяет, когда и как служба должна быть включена
WantedBy: Указывает, когда служба должна быть запущена (multi-user.target означает нормальную работу системы)
Сохраните файл и выйдите из редактора (нажмите
Ctrl+X, затемY, а затемEnterв nano).Посмотрим на наш недавно созданный файл службы:
cat /etc/systemd/system/hello-service.service
Вы должны увидеть содержимое, которое вы только что добавили в файл.

В следующем шаге вы узнаете, как загрузить и запустить эту службу с помощью команды systemctl daemon-reload.
Использование systemctl daemon-reload для применения изменений
Теперь, когда вы создали файл службы systemd, вам нужно сообщить systemd о новой службе. Именно здесь команда systemctl daemon-reload приходит на помощь.
Что такое systemctl daemon-reload?
Команда systemctl daemon-reload информирует systemd о необходимости перезагрузить все файлы служб и обновить его внутреннюю конфигурацию. Это необходимо, когда вы:
- Создаете новый файл службы
- Изменяете существующий файл службы
- Удаляете файл службы
Без выполнения этой команды systemd не распознает ваши изменения.
Перезагрузка конфигурации systemd
- Запустите следующую команду для перезагрузки конфигурации systemd:
sudo systemctl daemon-reload
При успешном выполнении эта команда не выводит никаких сообщений, но обновляет внутреннюю конфигурацию systemd.
- Теперь проверим, распознает ли systemd нашу новую службу:
systemctl status hello-service
Вы должны увидеть вывод, показывающий, что служба загружена, но неактивна:
● hello-service.service - Hello Service Demo
Loaded: loaded (/etc/systemd/system/hello-service.service; disabled; vendor preset: enabled)
Active: inactive (dead)
Запуск службы
- Запустим нашу службу:
sudo systemctl start hello-service
- Проверим статус снова, чтобы убедиться, что служба запущена:
systemctl status hello-service

Теперь вы должны увидеть, что служба активна и запущена:
● 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
- Проверим, действительно ли наша служба работает, посмотрев в файл журнала, который она создает:
cat /tmp/hello-service.log
Вы должны увидеть несколько строк вывода, похожих на:
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
Записи журнала покажут текущую дату и время, подтверждая, что наша служба запущена и выполняет сценарий, как ожидается.
- Включите службу, чтобы она автоматически запускалась при загрузке системы:
sudo systemctl enable hello-service
Вы должны увидеть вывод, похожий на:
Created symlink /etc/systemd/system/multi-user.target.wants/hello-service.service → /etc/systemd/system/hello-service.service.
Это означает, что служба теперь включена и будет автоматически запускаться при загрузке системы.
Теперь вы успешно создали службу, использовали systemctl daemon-reload, чтобы сообщить systemd об этом и запустили службу. В следующем шаге вы измените службу и примените изменения.
Изменение конфигурации службы
В этом шаге вы измените конфигурацию вашей службы и примените изменения с использованием systemctl daemon-reload. Это продемонстрирует важность этой команды при обновлении конфигураций служб.
Изменение файла службы
Изменим нашу службу, чтобы изменить частоту записи сообщений:
- Отредактируйте файл службы:
sudo nano /etc/systemd/system/hello-service.service
- Добавьте новую переменную окружения в раздел
[Service], чтобы контролировать интервал сна. Добавьте эту строку после строкиUser=labex:
Environment="SLEEP_INTERVAL=5"
Сохраните и закройте файл (нажмите
Ctrl+X, затемY, а затемEnterв nano).Теперь отредактируйте сценарий, чтобы использовать эту переменную окружения:
nano ~/project/scripts/hello-service.sh
- Измените сценарий, чтобы использовать переменную окружения (замените весь контент этим):
#!/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
- Сохраните и закройте редактор (нажмите
Ctrl+X, затемY, а затемEnterв nano).
Применение изменений
Теперь, когда вы внесли изменения как в файл службы, так и в сценарий, вам нужно применить эти изменения:
- Во - первых, перезагрузите конфигурацию systemd:
sudo systemctl daemon-reload
- Затем перезапустите службу, чтобы применить изменения:
sudo systemctl restart hello-service
- Проверьте статус службы:
systemctl status hello-service
Вы должны увидеть, что служба запущена с обновленной конфигурацией.
- Проверьте, вступили ли изменения в силу, проверив файл журнала:
sleep 15 ## Wait to collect a few log entries
cat /tmp/hello-service.log | tail -5
Теперь вы должны увидеть, что служба записывает сообщения каждые 5 секунд вместо 10, и записи журнала должны включать новую информацию о интервале:
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

Понимание происходящего
Рассмотрим, что только что произошло:
- Вы изменили файл службы, чтобы добавить переменную окружения.
- Вы обновили сценарий, чтобы использовать эту переменную окружения.
- Вы запустили
systemctl daemon-reload, чтобы сообщить systemd о изменениях в файле службы. - Вы перезапустили службу, чтобы применить эти изменения.
Без команды systemctl daemon-reload systemd не распознал бы изменения в файле службы, и переменная окружения не была бы передана сценарию при перезапуске службы.
Это демонстрирует, почему systemctl daemon-reload необходим при любом изменении файлов служб - это гарантирует, что systemd aware ваших изменений, прежде чем вы попытаетесь применить их, запустив или перезапустив службы.
Решение проблем и рекомендации по использованию наилучших практик
В этом финальном шаге вы узнаете о распространенных проблемах, которые могут возникнуть при работе с службами 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
Если ошибок нет, эта команда не выводит никаких сообщений. Любые синтаксические ошибки будут отчетываться.
Используйте шаблоны служб: Для служб, которые требуют нескольких экземпляров, используйте шаблоны служб (файлы с именем вида
service@.service), чтобы избежать дублирования.Проверяйте зависимости служб: Убедитесь, что ваши службы имеют правильные директивы
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 при управлении этими службами.
Резюме
В этом практическом занятии вы узнали, как использовать команду systemctl daemon-reload для управления демонами и службами на вашей Linux-системе. Вы:
- Разобрались в основах systemd и systemctl
- Создали пользовательский файл службы systemd
- Использовали systemctl daemon-reload для применения изменений в конфигурациях служб
- Изменили файлы служб и применили эти изменения
- Узнали, как устранять распространенные проблемы и следовать рекомендациям по использованию наилучших практик
Команда systemctl daemon-reload обязательна при работе с службами systemd, так как она гарантирует, что менеджер systemd будет aware любых изменений, которые вы вносите в конфигурации служб. Без этой команды ваши изменения в файлах служб не будут распознаны системой до следующего перезагрузки.
Этот навык будет полезен при дальнейшей работе с Linux-системами, позволяя вам эффективно управлять службами и убедиться, что ваши изменения в конфигурации будут правильно применены.



