Як написати systemd unit-файл для автозавантаження свого сервісу - Linux admin blog

systemd

Тут покажу як писати інітники для автозапуску будь-якого демона в системі з systemd.

Systemd оперує unit-файлами як файли конфігурації. Це як .conf файл для upstart або init-скрипти для initd. Unit-файли також можуть описувати інші системні сутності, але в даному випадку вони нас цікавлять як конфіг для автостарту сервісу. У Ubuntu 16.04 вони лежать у /etc/systemd/. Напишемо свій unit-файл.

Припустимо, у нас є програма, яку ми хочемо запускати як демон. Ось тут я писав як створити telegram-бота. У мене вийшов виконуваний файл, який запускається і висить чекає повідомлень. Тепер хочу, щоб він як демон стартував при завантаженні системи.

Створюємо такий файл:

і кладемо його в /etc/systemd/system/telegram-bot.service

Конфіг схожий на звичайний ini-файл:

After – запускати цей юніт після певних демонів чи цілей (мета – це набір юнітів). Тут вказано network.target , це означає, що демон запуститься після того, як піднімуться мережні інтерфейси.

Type – тип того, як запускається демон. Найчастіше використовується simple, forking або one-shot. simple - демон запускається і починає чекати на консолі та не відфоркується. forking – демон запускається, потім форкається і завершує батьківський процес. Багато програм саме так і запускаються, щоб перейти в режим background. Наприклад, nginx запускається за такою схемою. one-shot - використовується для запуску скриптів, які запускаються, відпрацьовують і завершуються. У моєму випадку це не скрипт і програма не форкається, тому тип - simple

ExecStart – команда для запуску демона.

Restart - рестартувати демон, якщо він завершиться/впаде. У always systemd буде перезапускати демон незалежно від того, чому він завершився.Можна вказати on-failure, тоді буде перезапускатись якщо демон вийшов з ненульовим кодом повернення або був завершений за сигналом (kill DAEMONPID)

WantedBy - говоримо, що запускати цей демон коли система вантажиться в multi-user режимі

Далі робимо релоад systemd:

І додаємо створений юніт в автозавантаження:

Всі. Сервіс доданий до автозавантаження, але ще не запущений. Запустимо: