2014-11-27 14 views
5

Mam usługę Java (zaimplementowaną przy użyciu Dropwizard), które uruchamiam z instancji użytkownika systemd. Jak na razie dobrze. Teraz chciałbym użyć systemusystemd, aby poinformować o stanie usługi (dostępny jako C library function lub shell script, ale ostatecznie obie metody rozmawiają z gniazdem przywoływanym przez zmienną środowiskową). Mogę uruchomić dowolny kod po uruchomieniu usługi, ale nie jestem pewien, jak najlepiej powiadomić systemd z poziomu Java.sd_notify() from Java

Inni programiści uruchamiają tę usługę w systemie Windows, więc w przypadku punktów bonusowych byłoby naprawdę przydatne, gdyby mój kod powiadomienia był dyskretny i nie powodował żadnych danych wyjściowych, jeśli nie byłby uruchomiony z systemem.

+0

Ponieważ ta funkcja powiadomień wymaga natywnego kodu, musisz użyć JNI i/lub JNA. –

Odpowiedz

2

Znalazłem tę implementację, która używa haków systemowych, ale przynajmniej nie wymaga JNA/JNI.

https://gist.github.com/yrro/18dc22513f1001d0ec8d

jak mówisz, Systemd używa gniazd odwołuje zmiennej środowiskowej (System.getenv („NOTIFY_SOCKET”) w kodzie), tak bym sobie wyobrazić, że może być również sposobem korzystania z Java Gniazdo, choć wyobrażam sobie, że będzie potrzebne wiele badań i/lub prób i błędów.

+0

Dobra rozmowa - jeszcze nie znalazłem lepszego rozwiązania. Usunąłem Twój link, ponieważ faktycznie odwołuje się do kopii tego pytania w klonie SO. –

+1

Ta klasa używa czegoś, rozwidlając proces potomny 'systemd-notify', który jest notorycznie niewiarygodny. [Jest lepszy sposób.] (Http://stackoverflow.com/a/36992645/340790) – JdeBP