Цей каталог містить файли сервісних блоків за замовчуванням, які постачаються з вашою системою.
Тепер, коли ви розумієте основи systemd та як перевіряти стан служб, ви готові створювати та змінювати файли служб на наступному кроці.
У цій статті ви дізнаєтесь, чому після зміни служби у Linux вона може не запуститися одразу, як працює команда systemctl daemon-reload і навіщо її виконувати перед перезапуском сервісів. Матеріал пояснює суть процесу простою мовою, допомагає зрозуміти, як systemd оновлює конфігурації без перезавантаження, і що робити, щоб ваші зміни почали діяти миттєво.
Systemd — це менеджер служб і систем для більшості сучасних дистрибутивів Linux, включаючи Ubuntu 22.04, який ми використовуємо в цій лабораторній роботі. Він відповідає за запуск і керування системними службами, а також systemctlє основним інструментом командного рядка, що використовується для взаємодії з systemd.
Демон — це фоновий процес, який безперервно працює у вашій системі Linux. Ці процеси виконують різні завдання, такі як обслуговування веб-сторінок (Apache, Nginx), керування базами даних (MySQL, PostgreSQL) або обробка системних подій. Systemd керує цими демонами за допомогою стандартизованих файлів конфігурації, які називаються «файлами модулів».
Почнемо з розгляду деяких основних 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, який запускатиме власний скрипт. Це допоможе вам зрозуміти, як працюють службові файли та як їх змінювати.
Спочатку створимо простий скрипт, який запускатиме наш сервіс:
Створіть каталог для вашого скрипта:
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, який запускатиме цей скрипт:
Створіть новий файл служби, використовуючи
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: Вказує, що ця служба має запускатися після того, як мережа буде готова
[Сервіс] : Визначає, як має працювати сервіс:
Type=simple: Послуга починається негайно.ExecStartКоманда для запуску (нашого скрипта).Restart: Автоматично перезапустити службу, якщо вона не вийде з ладу.UserОбліковий запис користувача для запуску служби
[Встановити] : Визначає, коли і як слід увімкнути службу:
WantedByВказує, коли слід запускати службу (multi-user.target означає нормальну роботу системи)
Збережіть файл і вийдіть з редактора (натисніть
Ctrl+X, потімY, а потімEnterу nano).
Давайте розглянемо наш щойно створений файл служби:
cat /etc/systemd/system/hello-service.service
Ви повинні побачити вміст, який ви щойно додали до файлу.
На наступному кроці ви дізнаєтеся, як завантажити та запустити цю службу за допомогою systemctl daemon-reloadкоманди.
Тепер, коли ви створили файл служби systemd, вам потрібно повідомити systemd про цю нову службу. Саме тут і systemctl daemon-reloadвступає в гру команда.
Команда systemctl daemon-reloadнаказує 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 буде обізнаний про ваші зміни, перш ніж ви спробуєте застосувати їх, запустивши або перезапустивши служби.
На цьому останньому кроці ви дізнаєтеся про поширені проблеми, які можуть виникати під час роботи з сервісами systemd, та про те, як їх вирішувати. Ви також дізнаєтеся про деякі найкращі практики роботи з systemctl daemon-reload.
Якщо ваша служба не запускається, першим кроком є перевірка її стану:
systemctl status hello-service
Це часто надає детальну інформацію про помилку. Давайте навмисно створимо помилку, щоб побачити, як її виправити:
Відредагуйте файл служби:
sudo nano /etc/systemd/system/hello-service.servic
Змініть
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
Під час усунення несправностей ви можете 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, щоб вийти з режиму відстеження журналу.
Ось кілька найкращих практик, яких слід дотримуватися під час роботи з systemd та daemon-reloadкомандою:
Завжди перезавантажувати після змін : Завжди запускати
systemctl daemon-reloadпісля зміни, додавання або видалення будь-яких файлів системних модулів.
Перевірте синтаксис перед застосуванням : Ви можете скористатися такою командою, щоб перевірити наявність синтаксичних помилок у файлах служби перед перезавантаженням:
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.
Ми поки що не видалятимемо файл служби, оскільки він нам все ще потрібен для перевірки.
Тепер ви розумієте, як створювати, змінювати та усувати несправності системних служб, а також важливість цієї systemctl daemon-reloadкоманди в управлінні цими службами.
гарна стаття, дуже сподобалось