LINUX.ORG.RU
решено ФорумAdmin

а как в этих ваших новомодных инитах с проверкой перед запуском?

 , , ,


0

1

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

пока нашёл только такой способ: сделать отдельный джоб и запускать нужный только если другой джоб не сфэйлился. не уверен, правда, как это работать будет, нужно ведь ещё ошибку выплюнуть

а что с этим в системд? нашёл только патч для ExecConfigTest

★★★

так и знал, всё плохо

xsektorx ★★★
() автор топика

Существует только один правильный вариант*: для применения нового конфига ты должен сказать об этом уже работающему процессу, сигналом или каким-нибудь кастомным средством RPC. После этого процесс должен перечитать свои конфиги без остановки работы и атомарно их применить. Если это сделать невозможно (например, конфиг кривой), то должен остаться в силе старый конфиг и процесс должен сообщить об ошибке.

Инит-системы к вопросу вообще никакого отношения не имеют.

upd. * для случая, когда два процесса не могут работать одновременно и предоставлять сервис одним и тем же клиентам.

Deleted
()
Последнее исправление: Deleted (всего исправлений: 1)

Я ничего не понял в этом потоке шизофазии. Если тебе надо, что бы при определённом условии демон проигнорировал команду остановки (как это можно понять из первого предложения), то ты хочешь настолько странного, что тебе надо срочно позвонить 03 и позвать Деда Мороза к телефону. К тебе приедут добрые люди в белых халат и увезут тебя в то место, где тебе будет хорошо.

Если же надо, чтобы демон запускался только при успешном выполнении определённого скрипта (как это можно понять из заголовка), то в systemd это делается через ExecStartPre. Например, nginx.service перед запуском проверяет корректность своего конфига и запускается только при успешной проверке:

[Unit]
Description=The nginx HTTP and reverse proxy server
After=syslog.target network.target remote-fs.target nss-lookup.target
 
[Service]
Type=forking
PIDFile=/run/nginx.pid
ExecStartPre=/usr/sbin/nginx -t
ExecStart=/usr/sbin/nginx
ExecReload=/bin/kill -s HUP $MAINPID
ExecStop=/bin/kill -s QUIT $MAINPID
PrivateTmp=true
 
[Install]
WantedBy=multi-user.target
redgremlin ★★★★★
()

В описание upstart написано, что если в pre-start сделать ″stop″, то запуска не будет и написано, что подобное можно сделать в pre-stop, то есть вызвать ″start″ или ″restart″ из pre-stop. Попробуйте.

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

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

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

иногда релоад не применяет конфиг, поэтому рестарт таки бывает нужен.

Это баг или недоработка в программе.

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

Как ни печально, но это абсолютно логично. Restart = (stop, pause, start), где длительность паузы не может быть заранее известна. Единственное исключение - когда новую копию сервиса с новым конфигом можно запустить рядом, а уже после запуска и готовности принимать клиентов - убить старую копию сервиса. Но редко такое решение технически возможно.

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

Я ничего не понял в этом потоке шизофазии. Если тебе надо, что бы при определённом условии демон проигнорировал команду остановки (как это можно понять из первого предложения), то ты хочешь настолько странного, что тебе надо срочно позвонить 03 и позвать Деда Мороза к телефону. К тебе приедут добрые люди в белых халат и увезут тебя в то место, где тебе будет хорошо.

В квотезы XD

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

Если тебе надо, что бы при определённом условии демон проигнорировал команду остановки

не демон, а апстарт. например потому что условия для рестарта нет, а мне надо почекать перед рестартом. а рестарт = стоп + старт, потому и надо перед стопом почекать. почему - см. выше

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

ну, если логически получится, то потыкаю

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

Задача — ничего не делать, если конфиг демона кривой. Утилита для проверки в наличии.

Запущен демон или нет — абсолютно не важно, поскольку попытки позапускать demonctl или послать HUP процессу с кривым конфигом могут привести к нежелательным последствиям от реинициализации базы до запуска МБР по рандомной цели.

Умеет так systemd?

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

Это баг или недоработка в программе

а если например программе нужно открыть порт? без рестарта не получится в теории. это тоже баг или недоработка?

это абсолютно логично

не вопрос, дело-то в другом

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

а мне надо почекать перед рестартом

Ну так почекай перед рестартом, ты же не по крону рестартишь. if test_config && systemctl restart my.service. Ну и даже если по крону, добавь туда ту же проверку перед рестартом.

а рестарт = стоп + старт

Вот только стоп = стоп, а ты его хочешь сделать могустопмогунестоп.

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

почекай перед рестартом, ты же не по крону рестартишь

а какже защита от дурака? ведь для этого оно и делается

стоп = стоп, а ты его хочешь сделать могустопмогунестоп

но ведь есть же возможность сделать могу старт, могу не старт. чому нельзя аналогичное?

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

а какже защита от дурака?

Присутствует в полном объёме. Штатно остановилось, не стало запускаться после проверки, никаких деструктивных последствий не наступило. Больше от защиты требовать нечего. Про систему «получить команду от дурака, догататься, что он имел ввиду, и выполнить наилучшим образом» обращаться всё к тому же Деду Морозу.

чому нельзя аналогичное?

Потому что вещи не аналогичные. Не стартовавший сервис деструктивных последствий не создаёт. Не остановившийся — создаёт.

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

Штатно остановилось

никаких деструктивных последствий не наступило

а клиенты не работают. если кому-то надо тормознуть принудительно, это делается самым обычным методом - посылается сигстоп процессу

Не остановившийся — создаёт

какие?

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

какие?

Получить SIGKILL в репу.

а клиенты не работают. если кому-то надо тормознуть принудительно, это делается самым обычным методом - посылается сигстоп процессу

Мы всё ещё про защиту от дурака?

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

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

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

ну, может уже про защиту от случайности и невнимательности

xsektorx ★★★
() автор топика

карач, в этом батле системд сделал апстарт как мой дед табуретку. томущо в системд можно хотя бы в execstop костылик прописать

xsektorx ★★★
() автор топика

сделать отдельный джоб и запускать нужный только если другой джоб не сфэйлился. не уверен, правда, как это работать будет, нужно ведь ещё ошибку выплюнуть

не сработало. если же в пре-стопе сделать start, то работает. костыльненько, конечно, но это ж убунта

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

найди мне пункт, где описано в доке, что можно с помощью start в pre-stop отменять остановку. про обратное написано, видел

алсо, костыль описанный в документации - это задокументированный костыль. никакой логики и ожидаемости

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

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

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

В документации написано расплывчато:

You can also use this stanza to cancel the stop, in a similar fashion to the way one can cancel the start in the pre-start.

но всё таки написано. И какая-то логика есть. Раз уж они используют ″stop″ в pre-start для отмены запуска, а не exit code от pre-start скрипта, то и для блокировки остановки логичнее использовать ″start″, а не exit code.

ИМХО, если уж закладывать в системе защиту от дурака, при которой stop/restart срабатывают только при определённом условии (допустим наличие конфига), дак тогда уж нужно вводить ещё команду безусловной остановки (типа service mysql shut). Причём делать это именно штатным подходом во всех дистрибутивах, а отдельным «приколом» вашего сервера. А без этого такая отмена команды ″stop″ может оказаться граблями для того, кто будет админить вашу систему после вас.

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

ога. спасибо, что вообще упомянули, что можно. а то б я дропнул это дело в итоге не разобравшись

кривоватая логика, в пре-старте, если память не изменяет, выполнение команды в результатом 1 тоже отменяет старт, а в пре-стопе ни разу

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