С Новым Годом Хабр!
Первого января все нормальные люди занимаются прокрастинацией,
уничтожением стратегического запаса оливье и прочими, не связанными
с физической или интеллектуальной нагрузкой вещами. Вот и я
планировал присоединиться к этой новогодней армии, но не тут-то
было!
Во всём виноват Хабр!
. Точнее хабражители! А, если ещё точнее, всему виной предновогодние статьи, в которых два никак не связанных между собой юзера изобрели два почти одинаковых велосипеда. Итак, встречайте моих сегодняшних героев!
Как создавался новогодний Хабрачат в этом годуСкачивается бинарник под нужную платформу изрелизов на github. Можно положить его, например, в
/usr/bin
. Далее пишем простой скрипт, который будет перезапускать сервер, в случае падения.(пропущен башизм с бесконечным циклом и прочими sleep-ами)
В процессе эксплуатации я заметил, что Domoticz иногда падает с ошибкой. Чтобы поднимать его автоматически, напишу watchdog с помощью cron.
(пропущены башизм, на пару с кронтабом)
Теперь каждые 5 минут будет запускаться скрипт, который проверит, работает ли Domoticz и перезапустит его, если это необходимо
Что с этим делать и как дальше жить?
Я совершенно не планировал писать статью освещающую самые основы systemd, у меня в планах, цикл статей из разряда systemd для продолжающих, но жизнь, как видно, вносит свои коррективы, в результате пусть моя сегодняшняя, коротенькая статья будет своеобразным прологом к планируемуму циклу. Но так как про написание сервисных юнитов systemd написано 100500 хаутушек, то мы осветим только параметры относящиеся к автоматическому перезапуску сервисов, на конкретных примерах (и на затравку кое что ещё ;-), в применении к статьям двух уважаемых хабровчан.
Делаем всё по фен-шую
Ну я надеюсь вы тут все достаточно технически грамотные, поэтому я сразу приведу готовые, самодокументированные юниты и конфиги, а так-же команды запуска всего этого безобразия.
Как создавался Хабрачат в этом году
Юнит(/etc/systemd/system/ssh-chat.service
):
[Unit]Description=SSH Chat ServiceAfter=network.target network-online.target[Service]# Пользователь и группа с правами которых будет запускаться сервисUser=ssh-chatGroup=ssh-chatType=SimpleExecStart=/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 DaemonAfter=network.target[Service]User=httpGroup=http# Эта директива позволяет выполнять подготовительные действия перед# запуском сервиса. Модификатор "+" указывает выполнять их от рута.ExecStartPre=+/usr/bin/install -d -m 0700 -o http -g http /var/run/domoticzExecStart=/opt/domoticz/domoticz -www 8080 -pidfile /var/run/domoticz/domoticz.pidPIDFile=/var/run/domoticz/domoticz.pidWorkingDirectory=/opt/domoticz# Всё то же самое, что и в случае "хабрачата", только таймаут 5 секунд.RestartSec=5Restart=on-failure[Install]WantedBy=multi-user.target
Инсталляция и запуск:
sudo systemctl enable --now domoticz
Что дальше?
Возможности systemd, кратко освещённые в этой статье, а так-же многие другие, более подробно будут разобраны в следующих статьях цикла. Триггеры, поддержка бинарных форматов, прозрачные(transient) юниты, встроенная контейнеризация and more, more... Но нетерпеливые могут уже вот прям щаз заняться чтением одной из лучших документаций в мире линукс. Маны которые можно почитать по сегодняшней теме:
man systemd.unitman systemd.serviceman systemctlman sysusers.dman systemd-sysusers
И на закуску маленький секрет. Один из моих любимых манов:
man systemd.directives
- путеводитель по всем
директивам конфигурации которые могут встретиться вам в процессе
изучения systemd.
Ещё раз С новым Годом Хабр! И используйте правильные инструменты! ;-)