LINUX.ORG.RU

Что должен уметь демон, чтобы его можно было перезапустить/стартовать из systemd?

 ,


0

1

День добрый!

Дали тут мне задачу сделать демона. Как сделать демона - понятно, книг/доков/примеров достаточно. А что должно быть в самом демоне, чтобы обеспечить поддержку start/restart/stop средствами systemd?

★★

в случае с type=simple и другими вариациями - ничего отличного от обычной работы програмки.
с type=dbus демону потребуется уметь работать с d-bus.

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

Ок, спасибо тебе, добрый человек!

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

D-bus точно не пригодится. И, да, скорее всего именно type=simple

Спасибо!

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

А что должно быть в самом демоне, чтобы обеспечить поддержку start/restart/stop средствами systemd?

По большому счёту, ничего. Для systemd даже «делать демона» не нужно — ты можешь обойтись просто процессом, который вечно работает на переднем плане и корректно реагирует на SIGTERM (или любой другой сигнал по твоему выбору, но тогда его нужно будет прописать в юните как KillSignal=).

Единственное (на правах совета) — чтобы systemd правильно понимал, когда твой демон закончил загружаться и начал работать, есть смысл сделать Type=notify, слинковаться с libsystemd и вызвать sd_notify("READY=1") по окончании загрузки. Это нужно по большому счёту для удобства администратора: systemctl start будет ждать окончания загрузки демона перед тем, как возвращать управление, и показывать проблемы в случае их возникновения. Если так не сделать, systemctl будет возвращать управление моментально, даже если демон, условно, упадёт через 500 мс из-за ошибки чтения конфига.

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

К великому счастью, ничего. Ни двойного форка, ни отвязки от терминала, ни процессных групп, ни сессий, ни пидфайлов (а без рейсов? а если pid другому процессу выделен?), ни самодельного логгирования, ни переоткрывания логов по USR1 для ротации, ни открытия fd 0/1/2 из/в /dev/null, ни сброса прав. Поэтому systemd (или так и быть, полноценные супервайзеры в целом) и рулит по сравнению со всякими недоrc.

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

Если ты пишешь в stdout/stderr, то оно попадает в journald и там всё само работает как надо.

Помнится были там проблемы с буфферизацией, особенно если Python-скрипты в unit’ы заворачивать, х.з. как сейчас.

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

Вот с логами есть вопрос: их хотят забирать по sftp. journald позволит складывать файлы в произвольное место? Или достаточно будет сделать симлинк на нужную директорию?

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

Type=notify, слинковаться с libsystemd и вызвать sd_notify(«READY=1»)

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

https://gist.github.com/maxlapshin/01773f0fca706acdcb4acb77d91d78bb

Там внутри просто открыть UDP сокет по пути из окружения и написать туда что-то.

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

я бы сказал, что в 2022-м году вообще очень неправильно тратить своё время на писание логов куда-то кроме stdout. И в чём либо кроме жсон формата.

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

прописываешь в юните в какое место писать stdout, stderr и океюшки.

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

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

хартбит неплохая штука, но всё это в теории можно и не делать, просто выкинуть на помойку истории все функции типа daemonize и т.п. и жить с stdin/stdout

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