Почему хабражители предпочитают велосипеды, вместо готовых решений? Или о systemd, part 0

от автора

С Новым Годом, Хабр!

Первого января все нормальные люди занимаются прокрастинацией, уничтожением стратегического запаса оливье и прочими, не связанными с физической или интеллектуальной нагрузкой вещами. Вот и я планировал присоединиться к этой новогодней армии, но не тут-то было!

Во всём виноват Хабр!

…. Точнее хабражители! А, если ещё точнее, всему виной — предновогодние статьи, в которых два никак не связанных между собой юзера изобрели два почти одинаковых велосипеда. Итак, встречайте моих сегодняшних героев!

Как создавался новогодний Хабрачат в этом году

Скачивается бинарник под нужную платформу из релизов на github. Можно положить его, например, в /usr/bin. Далее пишем простой скрипт, который будет перезапускать сервер, в случае падения.

… (пропущен башизм с бесконечным циклом и прочими sleep-ами)

© оригинал

Безумный дом

В процессе эксплуатации я заметил, что Domoticz иногда падает с ошибкой. Чтобы поднимать его автоматически, напишу watchdog с помощью cron.

… (пропущены башизм, на пару с кронтабом)

Теперь каждые 5 минут будет запускаться скрипт, который проверит, работает ли Domoticz и перезапустит его, если это необходимо

© оригинал

Что с этим делать и как дальше жить?

Я совершенно не планировал писать статью освещающую самые основы systemd, у меня в планах, цикл статей из разряда «systemd для продолжающих», но жизнь, как видно, вносит свои коррективы, в результате пусть моя сегодняшняя, коротенькая статья будет своеобразным прологом к планируемуму циклу. Но так как про написание сервисных юнитов systemd написано 100500 хаутушек, то мы осветим только параметры относящиеся к автоматическому перезапуску сервисов, на конкретных примерах (и на затравку кое что ещё ;-), в применении к статьям двух уважаемых хабровчан.

Делаем всё по фен-шую

Ну я надеюсь вы тут все достаточно технически грамотные, поэтому я сразу приведу готовые, самодокументированные юниты и конфиги, а так-же команды запуска всего этого безобразия.

«Как создавался Хабрачат в этом году»

Юнит(/etc/systemd/system/ssh-chat.service):

[Unit] Description=SSH Chat Service After=network.target network-online.target  [Service] # Пользователь и группа с правами которых будет запускаться сервис User=ssh-chat Group=ssh-chat Type=Simple ExecStart=/usr/local/bin/ssh-chat --admin=/etc/ssh-chat/admins --bind=0.0.0.0:22 --log /var/log/ssh-chat.log --motd=/etc/ssh-chat/motd # В каких случаях сервис будет автоматически перезагружаться. # on-failure — в случае выхода с ненулевым кодом возврата. Restart=on-failure # Таймаут перед загрузкой сервиса, после падения. RestartSec=1 # Capablities для сервиса. В данном случае - разрешение сервису # биндиться на привилегированные порты (< 1000) AmbientCapablities=CAP_NET_BIND_SERVICE  [Install] WantedBy=multiuser.target

Конфиг для systemd-sysusers.service(/etc/sysusers.d/ssh-chat.conf):

u ssh-chat - "SSH Chat user" /etc/ssh-chat # Поля записи: # u : создаём пользователя # ssh-chat : username # - : или UID[:GID] в данном случае автоматически занять свободные UID/GID < 1000 # "SSH Chat user" : Описание, или "-", если не нужно. # /etc/ssh-chat : Home Directory # Может быть ещё одно поле -- login shell. По умолчанию /usr/bin/nologin

Инсталляция и запуск:

sudo systemctl restart systemd-sysusers.service && sudo systemctl enable --now ssh-chat

«Безумный дом»

Юнит(/etc/systemd/system/domoticz.service):

[Unit] Description=Domoticz Daemon After=network.target  [Service] User=http Group=http # Эта директива позволяет выполнять подготовительные действия перед # запуском сервиса. Модификатор "+" указывает выполнять их от рута. ExecStartPre=+/usr/bin/install -d -m 0700 -o http -g http /var/run/domoticz ExecStart=/opt/domoticz/domoticz -www 8080 -pidfile /var/run/domoticz/domoticz.pid PIDFile=/var/run/domoticz/domoticz.pid WorkingDirectory=/opt/domoticz # Всё то же самое, что и в случае "хабрачата", только таймаут 5 секунд. RestartSec=5 Restart=on-failure  [Install] WantedBy=multi-user.target

Инсталляция и запуск:

sudo systemctl enable --now domoticz

Что дальше?

Возможности systemd, кратко освещённые в этой статье, а так-же многие другие, более подробно будут разобраны в следующих статьях цикла. Триггеры, поддержка бинарных форматов, «прозрачные»(transient) юниты, встроенная контейнеризация and more, more… Но нетерпеливые могут уже «вот прям щаз» заняться чтением одной из лучших документаций в мире линукс. Маны которые можно почитать по сегодняшней теме:

man systemd.unit man systemd.service man systemd.exec man systemctl man sysusers.d man systemd-sysusers

И на закуску маленький секрет. Один из моих любимых манов: man systemd.directives — путеводитель по всем директивам конфигурации которые могут встретиться вам в процессе изучения systemd.

Ещё раз С новым Годом, Хабр! И используйте правильные инструменты!

PS: Добавил ссылку на ман по systemd.exec. Как-то я про него малость забыл.

ссылка на оригинал статьи https://habr.com/ru/post/535872/


Комментарии

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *