SystemD или запуск вашей программы в фоне

Боль, я испытывал боль… Один всегда на холме мечей, опьяненный победой… о чем это я? Аниме крутое вышло.
Кто не понял, тот поймет… дружко стил here

Доброго времени суток, дорогой читатель. Я рад, что ты забрел на эту богом забытую страничку и читаешь этот текст… еще пару тысяч приветствий…

Крч, хотел запустить свой бинарник из этой статьи в фоне, а не тут то было. Казалось бы, все же очевидно:
Создать скрипт, в котором указать исполняемую программу, написать в скрипте, что ей нужно запускаться в фоне при старте системы, автоматически перезапускать программу в случае ее вылета. Все кажется таким очевидным, маленький опыт в скриптах есть, понимание тоже есть, пишешь скрипт, а получается ересь…

Подумал я, спросить у могучего интернетамиллион статей, которые, вроде бы, помогают, а некоторые не очень…
Утонул в мануалах systemD юный админ, который еще вчера устанавливал виндовс, а сегодня попер на крепость Linux…
В конечном итоге мне удалось написать этот херов скрипт, и помог мне в этом интернет, наставники-коллеги-друзья и куча человеко-часов чтения и сбора пазла воедино.
Сейчас попытаюсь простым языком описать, то что я сделал.

Дано:
Centos 7
Программа

Задача:
ааа она уже поставлена, точняк.

SystemD запускает сервисы, которые описаны в его конфигурации. Как напишите, так и будет работать. Фактически с помощью SystemD можно не только создать сервис, но и создать дополнительный процесс над существующим процессом. Тысячи функций SystemD уже описаны здесь, и я не вижу смысла переписывать это своими словами.

Для нас важно знать:
где лежит наш бинарник (который нужно запустить в фоне)
куда положить наш скрипт/сервис

Где лежит ваш бинарник знаете вы, а вот положить скрипт нужно сюда:

/etc/systemd/system/

имя файла в нашем случае должно быть yoursuperscript.service.
С
оздадим файл:

nano /etc/systemd/system/yoursuperscript.service.

И в моем, простом, случае приведем его к такому виду:

[Unit]
Description=httptest program
After=nginx.service

[Service]
Type=simple
ExecStart=/usr/bin/http-test
Restart=always

[Install]
WantedBy=multi-user.target

Почему файл имеет именно такой вид, вы уже могли сами прочесть из приведенных мной ссылок, но все же, поясню.

В данном случае, скрипт состоит из трех блоков. Они являются самыми часто используемыми блоками, есть и другие, которые решают другой спектр задач. Мне пока больше не нужно так что.

[Unit] — регистр учитывается, так что пишем с большой буквы.
Этот раздел объясняет то, с чем мы имеем дело. И что для нужно для запуска вашего скрипта.
В данном случае я объяснил, что это за скрипт (httptest program) и когда ему запускаться (After=nginx.service). Как уже было сказано, есть куча других настроек и условий, мне они не нужны.

По факту строка After=nginx.service означает, что юниты описанные в этой директиве стартанут после nginx, так как программа отдает ответ именно туда, толку от нее нет, если nginx не запущен.

[Service] — этот раздел самый интересный. Здесь описывается тип службы, и команды управления службой демоном systemD. (важно для systemD)
В зависимости от выбранного типа можно применить дополнительные директивы. Я выбрал тип simple — как понятно из названия «простой».
В мануале, заумными словами тягомотно растянуто определение, которое я понял вот так: создает процесс для описанной конфигурации.
Если по-пацански: просто укажи путь к бинарнику, и будет тебе счастье.

Собстна, что я и сделал командами управления:
ExecStart=/usr/bin/http-test — системная команда запуска (стартовать сервис мы будем иначе, впрочем, как и останавливать)
ExecStop=/usr/bin/http-test — стоп
Restart=always — строка означает рестартовать демон, если он завершится/упадет. При always systemd будет перезапускать демон независимо от того почему он завершился.

[Install] — в мане тягомотина, но этот раздел отвечает за автозапуск вашего скрипта.
Просто копирните значение и вставьте себе без лишних вопросиков…

Со скриптом разобрались. Сохраняемся выходим!

Далее смотрим статус нашего скрипта:

systemctl status yoursuperscript

Вывод будет примерно таким:

status yoursuperscript
yoursuperscript.service - httptest program
Loaded: loaded (/etc/systemd/system/yoursuperscript.service; disabled; vendor preset: disabled)
Active: inactive (dead)

Видим, что он disabled — разрешаем его:

systemctl enable yoursuperscript
systemctl status yoursuperscript

Если ошибок нет, то получим приятный ответ

systemctl -l status yoursuperscript
yoursuperscript.service - httptest program
Loaded: loaded (/etc/systemd/system/yoursuperscript.service; enabled; vendor preset: disabled)

Запускаем сервис:

systemctl start yoursuperscript

наслаждаемся проделанной работой:

systemctl status yoursuperscript

● yoursuperscript.service - httptest program
Loaded: loaded (/etc/systemd/system/yoursuperscript.service; enabled; vendor preset: disabled)
Active: active (running) since Sat 2018-11-10 16:27:49 MSK; 8h ago
Main PID: 912 (yoursuperscript)
CGroup: /system.slice/yoursuperscript.service
└─912 /usr/bin/yoursuperscript

Nov 10 16:27:49 x-conf systemd[1]: Started httptest program.
Nov 10 16:27:49 x-conf systemd[1]: Starting httptest program...

не забываем читать вывод в статусе, если есть ошибки >
исправлять их (как?*), и перезагружать демон systemD

systemctl daemon-reload

А управлять демоном start/stop/restart — вы можете так же при помощи systemctl. proof

systemctl stop yoursuperservice

Успехов!

 

 

 

*  — #хзесличестно