Більшість дистрибутивів Linux використовують
systemd як сучасний менеджер служб. Зазвичай нам потрібно стати
адміністратором , щоб контролювати служби.
Однак ми також можемо дозволити звичайним користувачам керувати своїми сервісами самостійно. Цей спосіб часто називають безкорневим.
Створення та додавання зразка служби
Спочатку створюємо програму яка повинна працювати як сервіс. Я для цього використав Telegram бот написаний на мові Go. Надалі створюємо юніт-файл сервісу
[Unit]
Description=Telegram bot
After=network.target
[Service]
Type=simple
ExecStart=/home/user/.soft/TelegramBot/TelegramBot
WorkingDirectory=/home/user/.soft/TelegramBot
StandardOutput=file:%h/log_file
Restart=on-failure
RestartSec=10
[Install]
WantedBy=default.target
Якщо дана служба необхідна іншим користувачам то файл служби необхідно закинути в каталог /etc/systemd/user, якщо ж служба потрібна тільки одному користувачу то файл наштаувань необхідно закинути в каталог /home/username/.config/systemd/user.
Ми можемо керувати службами як звичайні користувачі за допомогою опції користувача systemctl . Таким чином, служби можна ввімкнути/вимкнути, запустити/зупинити тощо без привілею sudo.
Отже, давайте оновимо данні systemd:
$ systemctl --user daemon-reload
Запуск сервісу:
$ systemctl --user start telegrambot.service
Перевіряємо статус сервісу:
● telegrambot.service - Telegram bot
Loaded: loaded (/home/username/.config/systemd/user/telegrambot.service; enabled; preset: enabled)
Active: active (running) since Fri 2024-12-20 10:53:02 EET; 5 days ago
Main PID: 840945 (TelegramBot)
Tasks: 6 (limit: 19057)
Memory: 15.0M
CPU: 9min 35.965s
CGroup: /system.slice/telegrambot.service
└─840945 /home/username/.soft/TelegramBot/TelegramBot
Dec 20 10:53:02 IoT systemd[1]: Started telegrambot.service - Telegram bot.
Знову ж таки, ми повинні зазначити, що ми зробили все це без команди sudo (окрім копіювання юніт файлу в каталог /etc/systemd/user)
Тепер увімкніть або вимкніть службу за допомогою systemctl :
$ systemctl --user enable telegrambot.service
Created symlink /home/username/.config/systemd/user/default.target.wants/telegrambot.service → /home/username/.config/systemd/user/telegrambot.service.
Таким чином, після ввімкнення сервіс запускається автоматично після нашого входу. Тоді він працюватиме, доки у нас є відкриті сесії. Іншими словами, екземпляр служби прив’язаний до користувача, а не до сеансу.
Нарешті, давайте вимкнемо його:
$ systemctl --user disable telegrambot.service
З правами root ми можемо ввімкнути або вимкнути службу для всіх користувачів за допомогою глобальної опції systemctl (якщо файл служби в каталозі /etc/systemd/user/):
$ sudo systemctl --global enable user_service.service
Created symlink /etc/systemd/user/default.target.wants/user_service.service → /etc/systemd/user/user_service.service.
Отже, усі користувачі отримують свій власний запущений екземпляр служби одразу після входу.
Припустімо, що ми плануємо наш сервіс виконувати довгострокові завдання, наприклад, обчислення. Отже, ми повинні продовжити його життя після закінчення останнього сеансу. У такому випадку ми використовуємо loginctl із командою enable-linger :
$ loginctl enable-linger
Тепер наші служби запускаються відразу після завантаження системи і працюють до завершення роботи. Слід пам’ятати, що це стосується всіх наших системних служб. Нарешті, ми можемо вимкнути його за допомогою disable-linger .
Тепер давайте перевіримо журнал служби за допомогою команди journalctl . Знову скористаємося опцією користувача :
$ journalctl --user -u telegrambot
# ...
Dec 20 10:48:33 IoT systemd[1]: Started telegrambot.service - Telegram bot.
Dec 20 10:48:33 IoT TelegramBot[840594]: 2024/12/20 10:48:33 service started!
Виникло питання підтримки різних сертифікатів для різних доменів. І як виявилось – це можливо. Отож далі приклати конфігурації: Postfix Після запускаємо $ postmap -F hash:/etc/postfix/vmail_ssl.map . . .
Прийшла пора розібратись із таймерами які нам надає Systemd на заміну старій добрій службі Cron. Cron і досі надійно працює в системі але всі системні . . .