====== Systemd ======
Система systemd — це сучасний менеджер ініціалізації та системних служб, який використовується в більшості сучасних дистрибутивів Linux (Ubuntu, Debian, Fedora, Arch, CentOS та ін.). Його мета — запускати та керувати службами, процесами, монтованими файловими системами, мережевими з’єднаннями, журналами тощо.
===== 🔧 Основи =====
==== Що таке unit? ====
unit — це файл опису об’єкта, яким управляє systemd. Є кілька типів юнітів:
* **service** – системні служби (*.service)
* **socket** – сокети (*.socket)
* **mount** – точки монтування (*.mount)
* **timer** – планування запуску (*.timer)
* **target** – групи юнітів (*.target)
* **device**, **path**, **snapshot**, тощо
===== 📂 Де зберігаються unit-файли? =====
* **/etc/systemd/system/** – для кастомних юнітів (переважно сюди кладеш свої сервіси)
* **/lib/systemd/system/** або **/usr/lib/systemd/system/** – системні юніти, що йдуть із пакетами
* **~/.config/systemd/user/** – юніти користувача (не root)
===== 📋 Перегляд юнітів (сервісів) =====
**Усі запущені сервіси:**
systemctl list-units --type=service
==== Усі (включно з неактивними): ====
systemctl list-units --type=service --all
==== Усі доступні юніти (навіть не завантажені): ====
systemctl list-unit-files
==== 🧪 Інформація про конкретний юніт ====
systemctl status nginx.service
==== Де саме знаходиться файл: ====
systemctl cat nginx.service
===== 🛠️ Керування службами =====
systemctl start example.service # Запустити
systemctl stop example.service # Зупинити
systemctl restart example.service # Перезапустити
systemctl reload example.service # Перезавантажити конфіг (без повного рестарту)
systemctl enable example.service # Увімкнути автозапуск
systemctl disable example.service # Вимкнути автозапуск
systemctl is-enabled example.service # Перевірити автозапуск
===== 📝 Як створити свій сервіс =====
Створи файл, наприклад:
sudo nano /etc/systemd/system/myapp.service
==== Приклад простого сервісу: ====
[Unit]
Description=MyApp Service
After=network.target
[Service]
ExecStart=/usr/bin/python3 /home/user/myapp.py
WorkingDirectory=/home/user
Restart=always
User=myuser
Environment="ENV_VAR=production"
[Install]
WantedBy=multi-user.target
==== Дії після створення: ====
sudo systemctl daemon-reexec # Повний перезапуск systemd (рідко треба)
sudo systemctl daemon-reload # Завантажити нові/змінені юніти
sudo systemctl enable myapp.service # Увімкнути автозапуск
sudo systemctl start myapp.service # Запустити сервіс
----
===== ⚙️ Основні параметри у [Service] =====
^**Параметр** ^**Опис** |
|_PARA__TABLE_INS_ExecStart |_PARA__TABLE_INS_Команда для запуску |
|_PARA__TABLE_INS_ExecStop |_PARA__TABLE_INS_Команда для зупинки |
|_PARA__TABLE_INS_Restart |_PARA__TABLE_INS_Що робити при аварії (e.g. always, on-failure) |
|_PARA__TABLE_INS_User, Group |_PARA__TABLE_INS_Під яким користувачем запускати |
|_PARA__TABLE_INS_WorkingDirectory |_PARA__TABLE_INS_Робоча директорія |
|_PARA__TABLE_INS_Environment= |_PARA__TABLE_INS_Задання змінних середовища |
|_PARA__TABLE_INS_Type= |_PARA__TABLE_INS_Тип юніту (simple, forking, oneshot, notify, idle) |
|_PARA__TABLE_INS_TimeoutSec= |_PARA__TABLE_INS_Час очікування до примусового завершення |
===== 🕒 Планувальник (timer) =====
Timer — заміна cron.
==== Створення пари: ====
/etc/systemd/system/backup.service
/etc/systemd/system/backup.timer
==== backup.timer ====
==== ====
[Unit]
Description=Щоденний бекап
[Timer]
OnCalendar=daily
Persistent=true
[Install]
WantedBy=timers.target
==== Активуй таймер: ====
sudo systemctl daemon-reload
sudo systemctl enable --now backup.timer
===== 📑 Журнали (логування) =====
Журнали зберігає journald.
==== Подивитися журнал конкретного сервісу: ====
journalctl -u myapp.service
==== Поточний лог у режимі реального часу: ====
journalctl -u myapp.service -f
===== 📍 Targets (аналог runlevels) =====
^**Target** ^**Опис** |
|_PARA__TABLE_INS_graphical.target |_PARA__TABLE_INS_GUI |
|_PARA__TABLE_INS_multi-user.target |_PARA__TABLE_INS_Консольна (без GUI) |
|_PARA__TABLE_INS_rescue.target |_PARA__TABLE_INS_Однокористувацький режим |
|_PARA__TABLE_INS_emergency.target |_PARA__TABLE_INS_Мінімальний режим (аналог single-user mode) |
----
===== 📌 Корисні команди =====
systemctl reboot # Перезавантажити систему
systemctl poweroff # Вимкнути комп'ютер
systemctl get-default # Поточний target
systemctl set-default multi-user.target # Змінити рівень запуску
===== 📚 Поради =====
* Замість cron, краще використовуй systemd-timer
* Використовуй Restart=always для постійно працюючих сервісів
* Логи зберігаються в /var/log/journal (може бути відключено)