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

Как заставить systemd считать демон запущенным только после появления строки в stdout?

 , , ,


0

1

Есть один демон, он запускается долго и после запуска требует дополнительного действия. Форкаться в нужный момент демон не умеет, об успешном запуске сигнализирует строкой «Finished loading» и открывает порт TCP.

Написан тривиальный юнит-файл

[Service]
Type=simple
ExecStart=/bin/qwerty
[Install]WantedBy=multi-user.target

Я признаться думал, что раз systemd умеет множеством способов ждать окончания запуска сервиса, и читает stdout сервиса, то он мог бы и грепать сразу, ну или открытия порта ждать. Однако никакой опции типа

ExpectStdout=Finished loading
я не нашёл.

Вопросы:

1) как красиво решить задачу (не переписывая демон и желательно без while ! grep log; do sleep 1m; done)

2) Столько свистелок, а такой простой вещи Поттеринг не сделал? какого хрена?!

ps в данном конктерном случае демон - sia, но для топика это неважно.

UPD: Мне надо, что бы systemd запускал следующий демон (зависимый) только после появления Finished loading

★★★★★

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

while ! grep log; do sleep 1m; done

Только так. Пишешь обёртку на шелле, в ней запускаешь в фоне демона, дальше journalctl -f -n0 -o cat -u UNITNAME | grep -q -x 'Finished loading' и делаешь Type=forking. Юнит будет считаться запущенным, когда завершится исходно запущенный процесс.

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

А тебе этот stdout вообще нужен? Если нет, то можно сразу запускать: qwerty | grep '^Finished loading$' и считать демон запущенным по появлению в stdout чего угодно

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

Мне надо, что бы systemd запускал следующий демон (зависимый) только после появления Finished loading.

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

Хороший вариант, спасибо, я не знал, что journalctl умеет в -f.

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

Type=notify — это как Type=simple. Юнит считается умершим при завершении исходно запущенного процесса. А у ТС в любом случае будет запуск в фоне.

intelfx ★★★★★
()

Если есть возможность изменить исходный код демона, то можно сделать так: В сервис-файл прописывается Type=notify и, при необходимости, NotifyAccess=all. В коде демона в месте завершения инициализации делается вызов sd_notify(0, «READY=1\n»); sd_notify объявлен в systemd/sd-daemon.h

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

Для костылей нужен. А по правильному нужно бы переписать демон, чтобы тот более строго и стандартизировано уведомлял о своём запуске, например, через сокеты.

Chaser_Andrey ★★★★★
()

То, что ты сейчас пытаешься сделать – это очень плохой дизайн. Что ты пытаешься получить в итоге?

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

дело в том что *нет* «строгого и стандартизированого уведомления о своём запуске». нет его, это миф можно вешать на уши только тем кто кроме дефолтных 10-ти демонов ничего не видел, да и то с натяжкой. а самое забавное что все эти грабли уже проходили, 10 лет назад с SMF, но нет, мы по-подростковому верим в идеалы недостижимые, все остальное нинужно ⓒ.

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

не пытайся, он упорот до предела, и тот чудный список с «sd-positive/sd-negative» это отлично подтверждает. мне помню надо было чтоб сервис конфиг из файла цеплял в строку запуска а не в env, тоже в скрипт послали писать потому что это «слишком высокоуровневая фича».

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

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

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

На инитскриптах это ещё хуже бы было.

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

Короче, сделал так:

[Unit]
Description=Sia Daemon

[Service]
User=siad
UMask=077
TimeoutStartSec=3h

ExecStart=/bin/sh -c "exec /home/siad/Sia/siad | tee /home/siad/log"
ExecStartPost=/bin/sh -c "tail -n0 --pid=$$$$ -f /home/siad/log 2> /dev/null | grep -q 'Loading renter'"

WorkingDirectory=/home/siad/Sia/
Restart=always

[Install]
WantedBy=multi-user.target

Сделал бы так сразу, но надеялся, что есть более элегантное решение.

Это нужно, потому что есть и второй сервис:

[Unit]
Description=Sia password
Requires=siad.service
After=siad.service
PartOf=siad.service

[Service]
Type=oneshot
TimeoutStartSec=10m
ExecStart=/bin/sh -c '/home/siad/Sia/siac wallet unlock < /home/legolegs/build/Sia.pwd'
WorkingDirectory=/home/siad/Sia/

[Install]
WantedBy=multi-user.target

Те, кто в теме Sia оценят.

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

Сделай скрипт-враппер на сторонний демон, который ждет подъема нужного сервиса по необходимым ему параметрам (порт, сокет, etc), но это лютый костыль.

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

Мне уже Поттеринг написал враппер, только не очень хороший, но я справился.

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

O'RLY? ;) Кто там кричал, что шел не нужен?

это частный случай кривого софта. и да: шелл - ненужен

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

А, у тебя он от пользователя запускается. Дай ему права на чтение файлов журнала — либо setfacl на каталоге с логами, либо добавь юзера в группу systemd-journal.

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

Да, этот момент я пропустил, спасибо. Но менять не буду.

Чёт неохота хипстерскому поделию на go давать какие-то права, пусть и на чтение логов.

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

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

вот если все кроме системд будет считаться легаси/маргинальщиной, то это можно будет считать стандартом(и то, ящитаю, с натяжкой, потому что в мире гнулинуксов пока еще не принято пытаться пропихивать одну софтину и выкидывать аналоги)

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

Во-первых, это интерфейс. Хейтеры должны страдать, а пользователи других супервизоров могут поспособствовать устранению фрагментации в мире GNU/Linux и реализовать предложенный интерфейс у себя.

Во-вторых, всё, кроме systemd и пары годных исключений — и так легаси и маргинальщина.

В-третьих, никто не предлагает выкидывать аналоги, т. к. аналогов не наблюдается.

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

это интерфейс

да, но интерфейс к одной из пока еще нескольких систем инициализации. каким хреном это стандарт?

Хейтеры должны страдать

кому должны? ничего они не должны

и да, а как же те, у кого не systemd по дефолту, и их все устраивает кроме, допустим, одной софтины, автор которой решил использовать этот «стандарт»? почему они должны страдать или менять систему инициализации?

и пары годных исключений

аналогов не наблюдается

выбери что-то одно

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

и да, а как же те, у кого не systemd по дефолту, и их все устраивает кроме, допустим, одной софтины, автор которой решил использовать этот «стандарт»? почему они должны страдать или менять систему инициализации?

Если у них не-systemd потому что так сложилось, и им пофиг, что под капотом — то к системе инициализации можно относиться как к своеобразной библиотеке-зависимости, и просто поставить systemd.

Если у них не-systemd по каким-то объективным причинам — то пусть допишут мостик между sd_notify и тем-что-у-них, это несложно.

Если у них не-systemd по каким-то религиозным причинам — то они должны страдать.

выбери что-то одно

Пара годных исключений — это, прежде всего, SMF. А оно не «аналог», потому что не для линуксов.

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

то пусть допишут мостик между sd_notify и тем-что-у-них

да, несложно. но какой тогда из этого стандарт?

то они должны страдать

нет. среди юзеров гнулинукса слишком много фанатиков. если все они будут страдать, то рано или поздно они куда-нибудь свалят, а без их фанатизма гнулинукс сгниет как коммьюнити

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

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

да, несложно. но какой тогда из этого стандарт?

В качестве стандарта предлагается использовать библиотечный вызов sd_notify() и/или UNIX-сокет по указанному в мане пути. Реализация может быть любая. Если весь софт (гипотетически) будет использовать этот интерфейс для оповещения о собственном запуске, а мне по какой-то причине придётся не использовать systemd, то написание мостика между этим сокетом и тем супервизором, который я использую, будет делом пяти минут.

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

Во-вторых, всё, кроме systemd и пары годных исключений — и так легаси и маргинальщина.

Наша религия самая правильная религия! Все то, что было прежде — устаревшие понятия о мироздании.

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

Не знаю, я только сдаю свой диск. Ещё не накопил достаточно сиамонеток, чтобы купить место.

Оно жруче до памяти и до io, мне даже пришлось один файл на tmpfs скинуть, иначе оно 3 часа читало его. Когда протокол стабилизируется надо будет написать нормальный демон на си и вкорячить его в роутер с hdd.

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

Ну, чувствуй разницу ;) — опенбсдешный rc (чистый ksh):

#!/bin/sh

daemon="/usr/local/bin/emacs"
daemon_flags="--daemon"

. /etc/rc.d/rc.subr

rc_stop() {
        ${daemon}client -e '(kill-emacs)'
}

rc_cmd $1

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

Дык, и замечательно! Теперь похожее по лаконичности и в линуксе есть. Но синтаксис юнитов мне никогда не нравился, тут Леня проштрафился, имхо.

А то, что имела место приведенная по ссылке писанина, озаглавленнаЯ «Debian/SysVinit» - это ад же. Твоё намного приличнее

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