Мы переводим наш flussonic на работу с systemd и я захотел воспользоваться его механизмом подтверждения того, что приложение запустилось.
Стандартный и официальный способ — использовать библиотеку systemd и использовать оттуда функцию sd_notify
Например для эрланга для этого есть библиотека https://github.com/systemd/erlang-sd_notify и похожее есть и для других платформ.
С этим подходом есть проблемы: 1) в любой современный язык втаскивать библиотеку на С — это задача, гораздо более неприятная, добавить библиотеку на самом языке. 2) в современных крутых платформах есть очень развитые подсистемы для работы с сокетом, а эта libsystemd делает чего-то, непойми что и не встраивается ни в libevent, ни в эрланговский event loop, ни в торнадо под питон.
Я решил сделать попроще, чего и вам советую:
https://gist.github.com/maxlapshin/01773f0fca706acdcb4acb77d91d78bb
ready() -> call(<<"READY=1">>).
reloading() ->call(<<"RELOADING=1">>).
stopping() -> call(<<"STOPPING=1">>).
watchdog() -> call(<<"WATCHDOG=1">>).
call(Call) ->
case os:getenv("NOTIFY_SOCKET") of
false ->
{error, not_configured};
Path ->
case gen_udp:open(0, [local]) of
{error, SocketError} ->
{error, SocketError};
{ok, Socket} ->
Result = gen_udp:send(Socket, {local,Path}, 0, Call),
gen_udp:close(Socket),
Result
end
end.
в принципе вот всё, что нужно для работы с systemd. По ссылке более полный код на эрланге, его легко переписать за 10 минут на %LANG%
Понятно, что systemd не обещает сохранять api, но я бы вообще не стал рассматривать systemd как что-то очень продуманное и что не будет меняться следующие 10 лет. Всё равно всё будут перекраивать