Linux: systemctl daemon-reload

LinuxLinuxBeginner
Практиковаться сейчас

💡 Этот учебник переведен с английского с помощью ИИ. Чтобы просмотреть оригинал, вы можете перейти на английский оригинал

Введение

В этом руководстве вы узнаете, как использовать команду 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, чтобы понять текущее состояние вашей системы:

  1. Откройте терминал, нажав на значок Терминал.

  2. Список всех активных системных служб можно получить с помощью следующей команды:

systemctl list-units --type=service
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, чтобы выйти из команды.

  1. Проверить статус определенной службы, например, службы SSH:
systemctl status 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"
  1. Теперь посмотрим, где хранятся файлы служб systemd. Именно с этими файлами мы будем работать в следующих шагах:
ls -l /etc/systemd/system/

В этой директории находятся файлы единиц служб, которые определяют, как systemd управляет службами. Вы должны увидеть несколько файлов .service и символические ссылки.

  1. Системно предоставляемые файлы единиц находятся в другой директории. Посмотрим на них:
ls -l /lib/systemd/system/

В этой директории находятся стандартные файлы единиц служб, которые поставляются с вашей системой.

Теперь, когда вы понимаете основы systemd и как проверять статус служб, вы готовы создавать и изменять файлы служб на следующем шаге.

Создание простого файла службы systemd

В этом шаге вы создадите простой файл службы systemd, который запускает пользовательский сценарий. Это поможет вам понять, как работают файлы служб и как их изменять.

Создание простого сценария

Сначала создадим простой сценарий, который будет запускаться нашей службой:

  1. Создайте директорию для вашего сценария:
mkdir -p ~/project/scripts
  1. Используйте текстовый редактор nano для создания простого сценария:
nano ~/project/scripts/hello-service.sh
  1. Добавьте следующее содержимое в сценарий:
#!/bin/bash

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

Нажмите Ctrl+X, чтобы выйти из редактора, затем Y, чтобы сохранить файл, а затем Enter, чтобы подтвердить имя файла.

Этот сценарий просто записывает сообщение с текущей датой в файл журнала каждые 10 секунд.

  1. Сделайте сценарий исполняемым:
chmod +x ~/project/scripts/hello-service.sh

Создание файла единицы службы systemd

Теперь создадим файл службы systemd, который будет запускать этот сценарий:

  1. Создайте новый файл службы с правами sudo:
sudo nano /etc/systemd/system/hello-service.service
  1. Добавьте следующее содержимое в файл службы:
[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 означает нормальную работу системы)
  1. Сохраните файл и выйдите из редактора (нажмите Ctrl+X, затем Y, а затем Enter в nano).

  2. Посмотрим на наш недавно созданный файл службы:

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

Вы должны увидеть содержимое, которое вы только что добавили в файл.

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

  1. Запустите следующую команду для перезагрузки конфигурации systemd:
sudo systemctl daemon-reload

При успешном выполнении эта команда не выводит никаких сообщений, но обновляет внутреннюю конфигурацию systemd.

  1. Теперь проверим, распознает ли 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)

Запуск службы

  1. Запустим нашу службу:
sudo systemctl start hello-service
  1. Проверим статус снова, чтобы убедиться, что служба запущена:
systemctl status 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
  1. Проверим, действительно ли наша служба работает, посмотрев в файл журнала, который она создает:
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

Записи журнала покажут текущую дату и время, подтверждая, что наша служба запущена и выполняет сценарий, как ожидается.

  1. Включите службу, чтобы она автоматически запускалась при загрузке системы:
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. Это продемонстрирует важность этой команды при обновлении конфигураций служб.

Изменение файла службы

Изменим нашу службу, чтобы изменить частоту записи сообщений:

  1. Отредактируйте файл службы:
sudo nano /etc/systemd/system/hello-service.service
  1. Добавьте новую переменную окружения в раздел [Service], чтобы контролировать интервал сна. Добавьте эту строку после строки User=labex:
Environment="SLEEP_INTERVAL=5"
  1. Сохраните и закройте файл (нажмите Ctrl+X, затем Y, а затем Enter в nano).

  2. Теперь отредактируйте сценарий, чтобы использовать эту переменную окружения:

nano ~/project/scripts/hello-service.sh
  1. Измените сценарий, чтобы использовать переменную окружения (замените весь контент этим):
#!/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. Сохраните и закройте редактор (нажмите Ctrl+X, затем Y, а затем Enter в nano).

Применение изменений

Теперь, когда вы внесли изменения как в файл службы, так и в сценарий, вам нужно применить эти изменения:

  1. Во - первых, перезагрузите конфигурацию systemd:
sudo systemctl daemon-reload
  1. Затем перезапустите службу, чтобы применить изменения:
sudo systemctl restart hello-service
  1. Проверьте статус службы:
systemctl status hello-service

Вы должны увидеть, что служба запущена с обновленной конфигурацией.

  1. Проверьте, вступили ли изменения в силу, проверив файл журнала:
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
cat /tmp/hello-service.log | tail -5

Понимание происходящего

Рассмотрим, что только что произошло:

  1. Вы изменили файл службы, чтобы добавить переменную окружения.
  2. Вы обновили сценарий, чтобы использовать эту переменную окружения.
  3. Вы запустили systemctl daemon-reload, чтобы сообщить systemd о изменениях в файле службы.
  4. Вы перезапустили службу, чтобы применить эти изменения.

Без команды systemctl daemon-reload systemd не распознал бы изменения в файле службы, и переменная окружения не была бы передана сценарию при перезапуске службы.

Это демонстрирует, почему systemctl daemon-reload необходим при любом изменении файлов служб - это гарантирует, что systemd aware ваших изменений, прежде чем вы попытаетесь применить их, запустив или перезапустив службы.

Решение проблем и рекомендации по использованию наилучших практик

В этом финальном шаге вы узнаете о распространенных проблемах, которые могут возникнуть при работе с службами systemd, и о том, как их устранять. Также вы узнаете о некоторых наилучших практиках при работе с командой systemctl daemon-reload.

Решение распространенных проблем

1. Служба не запускается

Если ваша служба не запускается, первым шагом является проверка ее статуса:

systemctl status hello-service

Это часто предоставляет подробную информацию об ошибке. Давайте намеренно создадим ошибку, чтобы увидеть, как ее устранять:

  1. Отредактируйте файл службы:
sudo nano /etc/systemd/system/hello-service.service
  1. Измените строку ExecStart, чтобы она указывала на несуществующий сценарий:
ExecStart=/home/labex/project/scripts/non-existent.sh
  1. Сохраните и закройте редактор.

  2. Перезагрузите конфигурацию systemd и попытайтесь перезапустить службу:

sudo systemctl daemon-reload
sudo systemctl restart hello-service
  1. Проверьте статус, чтобы увидеть ошибку:
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'.
  1. Исправьте файл службы, чтобы он снова указывал на правильный сценарий:
sudo nano /etc/systemd/system/hello-service.service
  1. Верните строку ExecStart обратно:
ExecStart=/home/labex/project/scripts/hello-service.sh
  1. Сохраните и закройте, затем перезагрузите и перезапустите:
sudo systemctl daemon-reload
sudo systemctl restart hello-service
  1. Проверьте, запущена ли служба снова:
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:

  1. Всегда перезагружайте после изменений: Всегда запускайте systemctl daemon-reload после изменения, добавления или удаления любых файлов единиц systemd.

  2. Проверяйте синтаксис перед применением: Вы можете использовать следующую команду, чтобы проверить наличие синтаксических ошибок в файлах служб перед перезагрузкой:

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

Если ошибок нет, эта команда не выводит никаких сообщений. Любые синтаксические ошибки будут отчетываться.

  1. Используйте шаблоны служб: Для служб, которые требуют нескольких экземпляров, используйте шаблоны служб (файлы с именем вида [email protected]), чтобы избежать дублирования.

  2. Проверяйте зависимости служб: Убедитесь, что ваши службы имеют правильные директивы After= и Requires=, чтобы обеспечить их запуск в правильном порядке.

  3. Корректно удаляйте службы: При удалении службы убедитесь, что вы останавливаете ее и отключаете перед удалением файла службы:

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-системами, позволяя вам эффективно управлять службами и убедиться, что ваши изменения в конфигурации будут правильно применены.