С Новым Годом!
Первого января все нормальные люди занимаются прокрастинацией, уничтожением стратегического запаса оливье и прочими, не связанными с физической или интеллектуальной нагрузкой вещами. Вот и я планировал присоединиться к этой новогодней армии, но не тут-то было!
Во всём виноват Хабр!
…. Точнее читатели! А, если ещё точнее, всему виной — предновогодние статьи, в которых два никак не связанных между собой юзера изобрели два почти одинаковых велосипеда. Итак, встречайте моих сегодняшних героев!
Скачивается бинарник под нужную платформу из релизов на github. Можно положить его, например, в … (пропущен башизм с бесконечным циклом и прочими sleep-ами) © оригинал В процессе эксплуатации я заметил, что Domoticz иногда падает с ошибкой. Чтобы поднимать его автоматически, напишу watchdog с помощью cron.
… (пропущены башизм, на пару с кронтабом) Теперь каждые 5 минут будет запускаться скрипт, который проверит, работает ли Domoticz и перезапустит его, если это необходимо © оригиналКак создавался новогодний Хабрачат в этом году
/usr/bin
. Далее пишем простой скрипт, который будет перезапускать сервер, в случае падения.Безумный дом
Что с этим делать и как дальше жить?
Я совершенно не планировал писать статью освещающую самые основы 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 systemctl
man sysusers.d
man systemd-sysusers
И на закуску маленький секрет. Один из моих любимых манов: man systemd.directives
- путеводитель по всем директивам конфигурации которые могут встретиться вам в процессе изучения systemd.
Ещё раз С новым Годом! И используйте правильные инструменты!
Автор: Вадим Прилуцкий