====== 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 (може бути відключено)