Змінив сервіс у Linux, але він не працює? Дізнайся, навіщо потрібен daemon-reload

24.10.2025 4 хвилин Автор: Lady Liberty

У цій статті ви дізнаєтесь, чому після зміни служби у Linux вона може не запуститися одразу, як працює команда systemctl daemon-reload і навіщо її виконувати перед перезапуском сервісів. Матеріал пояснює суть процесу простою мовою, допомагає зрозуміти, як systemd оновлює конфігурації без перезавантаження, і що робити, щоб ваші зміни почали діяти миттєво.

Розуміння основ systemd та systemctl

Systemd — це менеджер служб і систем для більшості сучасних дистрибутивів Linux, включаючи Ubuntu 22.04, який ми використовуємо в цій лабораторній роботі. Він відповідає за запуск і керування системними службами, а також systemctlє основним інструментом командного рядка, що використовується для взаємодії з systemd.

Що таке системний демон?

Демон — це фоновий процес, який безперервно працює у вашій системі Linux. Ці процеси виконують різні завдання, такі як обслуговування веб-сторінок (Apache, Nginx), керування базами даних (MySQL, PostgreSQL) або обробка системних подій. Systemd керує цими демонами за допомогою стандартизованих файлів конфігурації, які називаються «файлами модулів».

Основні команди systemctl

Почнемо з розгляду деяких основних systemctlкоманд, щоб зрозуміти поточний стан вашої системи:

  1. Відкрийте термінал, натиснувши на значок Терміналу.

  2. Перерахуйте всі активні системні служби за допомогою наступної команди:

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

Ви повинні побачити детальну інформацію про службу 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: Вказує, що ця служба має запускатися після того, як мережа буде готова

  • [Сервіс] : Визначає, як має працювати сервіс: Type=simple: Послуга починається негайно. ExecStartКоманда для запуску (нашого скрипта). Restart: Автоматично перезапустити службу, якщо вона не вийде з ладу. UserОбліковий запис користувача для запуску служби

  • [Встановити] : Визначає, коли і як слід увімкнути службу: WantedByВказує, коли слід запускати службу (multi-user.target означає нормальну роботу системи)

  1. Збережіть файл і вийдіть з редактора (натисніть Ctrl+X, потім Y, а потім Enterу nano).

  2. Давайте розглянемо наш щойно створений файл служби:

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

Ви повинні побачити вміст, який ви щойно додали до файлу.

На наступному кроці ви дізнаєтеся, як завантажити та запустити цю службу за допомогою systemctl daemon-reloadкоманди.

Використання systemctl daemon-reload для застосування змін

Тепер, коли ви створили файл служби systemd, вам потрібно повідомити systemd про цю нову службу. Саме тут і systemctl daemon-reloadвступає в гру команда.

Що таке демон-перезавантаження systemctl?

Команда 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

Тепер ви повинні побачити, що служба активна та працює:

● 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

Розуміння того, що сталося

Давайте розберемося, що щойно сталося:

  1. Ви змінили файл служби, щоб додати змінну середовища.

  2. Ви оновили скрипт для використання цієї змінної середовища.

  3. Ви запустили команду, systemctl daemon-reloadщоб повідомити systemd про зміни у файлі служби.

  4. Ви перезапустили службу, щоб застосувати ці зміни.

Без цієї systemctl daemon-reloadкоманди systemd не розпізнав би зміни у файлі служби, а змінна середовища не була б передана скрипту під час перезапуску служби.

Це демонструє, чому systemctl daemon-reloadце важливо щоразу, коли ви змінюєте файли служб – це гарантує, що systemd буде обізнаний про ваші зміни, перш ніж ви спробуєте застосувати їх, запустивши або перезапустивши служби.

Виправлення неполадок та найкращі практики

На цьому останньому кроці ви дізнаєтеся про поширені проблеми, які можуть виникати під час роботи з сервісами systemd, та про те, як їх вирішувати. Ви також дізнаєтеся про деякі найкращі практики роботи з systemctl daemon-reload.

Виправлення поширених проблем

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

Якщо ваша служба не запускається, першим кроком є ​​перевірка її стану:

systemctl status hello-service

Це часто надає детальну інформацію про помилку. Давайте навмисно створимо помилку, щоб побачити, як її виправити:

  1. Відредагуйте файл служби:

sudo nano /etc/systemd/system/hello-service.servic
  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

Ось кілька найкращих практик, яких слід дотримуватися під час роботи з systemd та daemon-reloadкомандою:

  1. Завжди перезавантажувати після змін : Завжди запускати systemctl daemon-reloadпісля зміни, додавання або видалення будь-яких файлів системних модулів.

  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.

Ми поки що не видалятимемо файл служби, оскільки він нам все ще потрібен для перевірки.

Тепер ви розумієте, як створювати, змінювати та усувати несправності системних служб, а також важливість цієї systemctl daemon-reloadкоманди в управлінні цими службами.

Висновок

Команда systemctl daemon-reload є ключовим інструментом у Linux для оновлення змін у конфігурації служб без перезавантаження системи. Вона дозволяє системі розпізнати нові або змінені файли служб і застосувати оновлення коректно. Розуміння роботи з systemd допомагає ефективно керувати процесами, уникати помилок і підтримувати стабільність системи під час адміністрування.
Підписатися
Сповістити про
1 Коментар
Найстаріші
Найновіше Найбільше голосів
PudgeAdmin
Редактор
6 місяців тому

гарна стаття, дуже сподобалось

Знайшли помилку?
Якщо ви знайшли помилку, зробіть скріншот і надішліть його боту.