LINUX.ORG.RU
ФорумAdmin

О сложности написания скриптов OpenRC и systemd

 , ,


0

4

Сначала я взглянул на самый простой вариант

#!/sbin/openrc-run
command="/path/to/binary/file"
name="some words about service"
[Unit]
Description=some words about service
[Service]
ExecStart=/path/to/binary/file
Существенной разницы нет, и тут меня systemd порадовал ― он действительно позволяет писать unit также просто, как и в других системах инициализации. Даунгрейда нет.

Далее посмотрел на реальные сервисы, например hostapd

[Unit]
Description=Hostapd IEEE 802.11 AP, IEEE 802.1X/WPA/WPA2/EAP/RADIUS Authenticator
After=network.target

[Service]
ExecStart=/usr/sbin/hostapd /etc/hostapd/hostapd.conf

[Install]
WantedBy=multi-user.target
#!/sbin/openrc-run
# Copyright 1999-2014 Gentoo Foundation
# Distributed under the terms of the GNU General Public License v2
# $Id$

pidfile="/run/${SVCNAME}.pid"
command="/usr/sbin/hostapd"
command_args="-P ${pidfile} -B ${OPTIONS} ${CONFIGS}"

extra_started_commands="reload"

depend() {
        local myneeds=
        for iface in ${INTERFACES}; do
                myneeds="${myneeds} net.${iface}"
        done

        [ -n "${myneeds}" ] && need ${myneeds}
        use logger
}

start_pre() {
        local file

        for file in ${CONFIGS}; do
                if [ ! -r "${file}" ]; then
                        eerror "hostapd configuration file (${CONFIG}) not found"
                        return 1
                fi
        done
}

reload() {
        start_pre || return 1

        ebegin "Reloading ${SVCNAME} configuration"
        kill -HUP $(cat ${pidfile}) > /dev/null 2>&1
        eend $?
}
Сначала у меня промельнкнуло в голове «вау, насколько немногословно написан systemd unit», но после этого всмотрелся в openrc скрипт и понял, что кроме простого запуска он реализует также и проверку наличия конфигурационного файла, и наличия интерфейса, а также дополнительную команду для обновления конфигурации hostapd без перезапуска.

В связи с этим вопрос ― каким образом нужно изменить hostapd.service для того, чтобы он был также функционален, как и в случае с openrc?

Deleted

Последнее исправление: Deleted (всего исправлений: 1)
Ответ на: комментарий от alpha

Ну и для проверки наличия файла есть AssertPathExists

Из документации не очень понятно (потому что «before starting») ― Assert* срабатывают только при старте, или при reload тоже?

Deleted
()
Ответ на: комментарий от Deleted

Ты можешь поставить какое-нибудь эхо и посмотреть что и когда срабатывает, если документация не полна, или слишком сложна.

imul ★★★★★
()
Ответ на: комментарий от imul

От содержимого /etc/conf.d ничем. А вот действия, которые можно осуществлять над полученными переменными в systemd юните, сильно ограничены. Декларативка против шелла же

makoven ★★★★★
()
Ответ на: комментарий от alpha

Ничего плохого в этом не вижу. Это какие-то предрассудки.

anonymous00 ★★
()

Тролль троллей троллит троллингом о затролленым троллями троллинге троллем троллей

Опять жолхиф набрасывает, не стыдно?

awesomebuntu
()
Ответ на: комментарий от makoven

Укажи в ExecPre и/или Exec скрипт и скриптуй до посинения значения из энвиромента. Покажи пример, где скриптовать жизненно необходимо и иного варианта в принципе не существует.

imul ★★★★★
()
Последнее исправление: imul (всего исправлений: 1)
Ответ на: комментарий от imul

Удваиваю.

Более того, в случае systemd ты вместо истеричного блуждания по /var/log просто делаешь systemctl status hostapd и видишь, что нет конфигурационного файла/интерфейса/еще. Так что все эти манипуляции-костыли, которые придумали для openrc, в котором вывод ошибочных сообщений при запуске еще не факт, что в лог попадет — просто не нужны.

derlafff ★★★★★
()
Ответ на: комментарий от imul

Укажи в ExecPre и/или Exec скрипт

Это понятно. Вопрос лишь в удобстве. В openrc сразу шелл и дефолтная папочка с конфигами для скриптов

Покажи пример, где скриптовать жизненно необходимо и иного варианта в принципе не существует

Согласен. В большинстве случаев не нужно. В примере из оп-поста нужно

makoven ★★★★★
()
Ответ на: комментарий от makoven

В примере из оп-поста нужно

В примере из оп-поста делается через @

Вопрос лишь в удобстве.

Вопрос больше (имхо) в привычке

imul ★★★★★
()

проверку наличия конфигурационного файла

Зачем он это делает? Этим же вполне успешно сам hostapd занимается, отказываясь запустится при отсутствии/невалидности конфига.

дополнительную команду для обновления конфигурации hostapd без перезапуска

ExecReload

и наличия интерфейса

Если я правильно понял (мог понять и неправильно, т.к. не эксперт по openrc) он делает не это. Он делает некий аналог Require=network.target, потому что в парадигме openrc нет аналога более правильного After=network.target

redgremlin ★★★★★
()

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

А зачем все это надо?

Siado ★★★★★
()
Ответ на: комментарий от Siado

Затем же, зачем ты смотришь под ноги, когда ходишь по улице — чтобы избежать лишних проблем.

Deleted
()
Ответ на: комментарий от Deleted

Затем же, зачем ты смотришь под ноги, когда ходишь по улице — чтобы избежать лишних проблем.

Ты суть не улавливаешь. Чтобы тебе было понятно перефразирую: когда я хожу по улице, под ноги смотрю я, а не мои кроссовки.

Siado ★★★★★
()
Ответ на: комментарий от Siado

когда я хожу по улице, под ноги смотрю я, а не мои кроссовки.

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

Deleted
()
Ответ на: комментарий от Deleted

Получается что это ненужный комбайн с костылями. Если ты пишешь программу - то за такие вещи должна отвечать именно она. Это тоже самое, когда некоторые джаваскриптеры пишут при открытии файла «C://path/to/gile» а потом удивляются почему у них на кросс-платформенной жабке не получается кросс-платформенной программы.

Я к тому, что нужно точно понимать, что должна делать система инициализации, а что не должна.

Siado ★★★★★
()
Ответ на: комментарий от Siado

Получается что это ненужный комбайн с костылями.

Я к тому, что нужно точно понимать, что должна делать система инициализации, а что не должна.

А вы точно sd-положительный?

Deleted
()
Ответ на: комментарий от Deleted

Неверное сравнение.

реализует также и проверку наличия конфигурационного файла

Это скорее «кроссовки сообщают, что ты упал, когда ты уже упал». Интересная фича, но бесполезная.

наличия интерфейса

Это уже полезно, но тут systemd делает то же самое.

дополнительную команду для обновления конфигурации hostapd без перезапуска

В systemd возможность определить такую команду тоже предоставляется. Просто в этом файле её нет. У меня в арче в hostapd.service ExecReload есть, а откуда ты взял этот файл, не знаю.

f1u77y ★★★★
()
Последнее исправление: f1u77y (всего исправлений: 2)

#!/sbin/openrc-run

Хе-хе

#!/sbin/systemd-run /path/to/binary/file
#!/sbin/systemd-run /sbin/bash

echo lolkek
echo that's all under systemd
exec /path/to/binary/file

Но это просто пример с неба, я ничего не знаю про openrc-run.

pavelshuvalov
()

Тред не читал

проверку наличия конфигурационного файла

Мне кажется, что это должно быть возложено на запускаемую софтину... но если это всё равно необходимо, то можно написать так:

ExecStartPre=/usr/bin/bash -c ...
ExecStart=...

Отвечая на возможный вытекающий вопрос: да, процесс под ExecStartPre зафейлит сервис, если команда под bash вернёт код возврата, соответствующий ошибке.

наличия интерфейса

[Unit]
Wants=network-online.target
After=network.target network-online.target

https://unix.stackexchange.com/a/126146 https://www.freedesktop.org/wiki/Software/systemd/NetworkTarget/

обновления конфигурации hostapd

ExecReload= , как в sshd.service .

Таким образом,

[Unit]
Description=Hostapd IEEE 802.11 AP, IEEE 802.1X/WPA/WPA2/EAP/RADIUS Authenticator
Wants=network-online.target
After=network.target network-online.target

[Service]
ExecStartPre=/usr/bin/bash -c ...
ExecStart=/usr/sbin/hostapd /etc/hostapd/hostapd.conf
ExecReload=/bin/kill -HUP $MAINPID

[Install]
WantedBy=multi-user.target
pavelshuvalov
()
Ответ на: комментарий от Deleted

Ты типа думаешь, что системд - это комбайн? Такое часто бывает, синдром утенка называется, что первое слышишь - то и повторяешь, не въезжая в тему. А на самом деле системд решает задачи инициализации и делает это хорошо. =)

Siado ★★★★★
()
Ответ на: комментарий от Siado

А на самом деле системд решает задачи инициализации и делает это хорошо. =)

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

anc ★★★★★
()
Ответ на: комментарий от deadNightTiger

не говоря о многочисленных Assert*-директивах

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

Bad_ptr ★★★★★
()
Ответ на: комментарий от deadNightTiger

Гм. Да. Чего это я сюда bash вставил, если можно ассерты использовать.

pavelshuvalov
()
Ответ на: комментарий от anc

Так это пишут те, кто на бочке с порохом сидит (арчеводы и прочие любители экзотики). Лично у меня с тех пор, как на серверах все центоси сменил с 6-й на 7-ю версию, а это было давно, проблем с запуском своих проектов вообще не видел. Один раз пишу из буквально нескольких строк сервис и получаю полный фарш с автозапуском, авторперезапуском и т.д.

Siado ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.