Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

Dienste, Child-Prozesse und Windows Shutdown

33 views
Skip to first unread message

Daniel Weber

unread,
Jul 23, 2012, 5:24:09 AM7/23/12
to
Hallo zusammen,

gegeben ist ein Dienst (C++) der einen oder mehrere Child-Prozesse
(Java) startet, ᅵberwacht und ggf. bei unerwartetem Ableben erneut
startet. Funktioniert soweit sein Jahren problemlos.

Nun stellen wir fest, dass bei einem Windows Shutdown/Restart zuerst die
Java-Child-Prozesse hart beendet werden (mᅵglicherweise reagiert
java.exe auch auf WM_ENDSESSION mit dem harten Ende), der Dienst lᅵuft
zu diesem Zeitpunkt aber noch, sieht den Child-Prozess sterben und
startet ihn neu.

Gibt es die Mᅵglichkeit, dass der Dienst, obwohl er vom Service-Monitor
noch kein "Stop" bekommen hat, erkennen kann, dass das System gerade
einen Shutdown/Restart macht, damit wir die Child-Prozesse in dem Fall
nicht wieder anwerfen?

Ciao,
Daniel

Uwe Sieber

unread,
Jul 23, 2012, 6:58:54 AM7/23/12
to
Da hilft nur ein kleiner Helfer-Prozess mit unsichtbarem
Fenster, der im User-Kontext lᅵuft. Wenn der WM_SESSION
(unter XP kommt vorher noch WM_QUERYENDSESSION) empfᅵngt,
schickst Du das z.B. per Pipe nach unten an den Service.
Oder Du ᅵberwachst einfach den Helfer-Prozess und wenn
der beendet wird, wirds wohl ein Session-Ende sein -
abstᅵrzen wird er in Ermangelung jeglicher Funktionalitᅵt
wohl nicht :-)

Gruᅵ Uwe

Daniel Weber

unread,
Jul 23, 2012, 8:12:17 AM7/23/12
to
Am 23.07.2012 12:58, schrieb Uwe Sieber:
> Da hilft nur ein kleiner Helfer-Prozess mit unsichtbarem
> Fenster, der im User-Kontext lᅵuft. Wenn der WM_SESSION
> (unter XP kommt vorher noch WM_QUERYENDSESSION) empfᅵngt,
> schickst Du das z.B. per Pipe nach unten an den Service.

Danke, das hatte ich fast schon befᅵrchtet...

Ciao,
Daniel

Stefan Kanthak

unread,
Jul 23, 2012, 8:47:11 AM7/23/12
to
"Daniel Weber" <use...@daniel-weber.eu> schrieb:


> Gibt es die Mᅵglichkeit, dass der Dienst, obwohl er vom Service-Monitor
> noch kein "Stop" bekommen hat, erkennen kann, dass das System gerade
> einen Shutdown/Restart macht, damit wir die Child-Prozesse in dem Fall
> nicht wieder anwerfen?

<http://msdn.microsoft.com/en-us/library/ms685058.aspx> wird bei Diensten
anstelle von WM_QUERYENDSESSION aufgerufen.
Siehe <http://msdn.microsoft.com/en-us/library/aa376890.aspx>

Stefan
[
--
Die unaufgeforderte Zusendung werbender E-Mails verstoesst gegen ᅵ823
Abs. 1 sowie ᅵ1004 Abs. 1 BGB und begruendet Anspruch auf Unterlassung.
Beschluss des OLG Bamberg vom 12.05.2005 (AZ: 1 U 143/04)


Daniel Weber

unread,
Jul 23, 2012, 9:10:19 AM7/23/12
to
Am 23.07.2012 14:47, schrieb Stefan Kanthak:
> "Daniel Weber" <use...@daniel-weber.eu> schrieb:
>> Gibt es die Mᅵglichkeit, dass der Dienst, obwohl er vom Service-Monitor
>> noch kein "Stop" bekommen hat, erkennen kann, dass das System gerade
>> einen Shutdown/Restart macht, damit wir die Child-Prozesse in dem Fall
>> nicht wieder anwerfen?
>
> <http://msdn.microsoft.com/en-us/library/ms685058.aspx> wird bei Diensten
> anstelle von WM_QUERYENDSESSION aufgerufen.

Das ist schon klar. Das Problem ist, dass die Nicht-Dienst-Prozesse wohl
zuerst abgerᅵumt werden und dann erst die Dienste. D.h. der Dienst weiᅵ
in dem Moment wo sein Child abgerᅵumt wird noch nicht, dass gleich ein
Shutdown folgen wird, startet sein Child also - wie es seine Aufgabe ist
- neu. Danach kommt dann erst der Shutdown des Dienstes...

Ciao,
Daniel

Stefan Kanthak

unread,
Jul 23, 2012, 9:28:12 AM7/23/12
to
"Daniel Weber" <use...@daniel-weber.eu> schrieb:
Du wertest den Return Code der Clients (nicht) aus?
Was geben die Clients als Reaktion auf ihre normale Beendigung per
WM_ENDSESSION zurueck?

> Danach kommt dann erst der Shutdown des Dienstes...

Wie waer's mit <http://msdn.microsoft.com/en-us/library/aa373347.aspx>
statt der Kruecke "Dienst startet Applikation"?

Daniel Weber

unread,
Jul 23, 2012, 10:30:32 AM7/23/12
to
Am 23.07.2012 15:28, schrieb Stefan Kanthak:
> Du wertest den Return Code der Clients (nicht) aus?
> Was geben die Clients als Reaktion auf ihre normale Beendigung per
> WM_ENDSESSION zurueck?

Das ist ein Java-Prozess, falls er WM_ENDSESSION auswertet kriegen wir
das nicht mit, wir sehen lediglich ein SIGTERM und einen Return Code 143.

>> Danach kommt dann erst der Shutdown des Dienstes...
>
> Wie waer's mit <http://msdn.microsoft.com/en-us/library/aa373347.aspx>
> statt der Kruecke "Dienst startet Applikation"?

Der Java-Prozess ist ein Server ohne UI und sollte daher am ehesten
selbst als Dienst laufen... wenn Du mir verrᅵtst, wie man einen
Java-Prozess als richtigen Windows-Dienst laufen lᅵᅵt, dann mache ich
das gerne. Bis dahin ist der Umweg ᅵber den Monitoring-Dienst leider
unumgᅵnglich.

Ciao,
Daniel

Stefan Kanthak

unread,
Jul 23, 2012, 10:50:53 AM7/23/12
to
"Daniel Weber" <use...@daniel-weber.eu> schrieb:

> Am 23.07.2012 15:28, schrieb Stefan Kanthak:
>> Du wertest den Return Code der Clients (nicht) aus?
>> Was geben die Clients als Reaktion auf ihre normale Beendigung per
>> WM_ENDSESSION zurueck?
>
> Das ist ein Java-Prozess, falls er WM_ENDSESSION auswertet kriegen wir
> das nicht mit, wir sehen lediglich ein SIGTERM und einen Return Code 143.

SIGTERM unter Windows?

>>> Danach kommt dann erst der Shutdown des Dienstes...
>>
>> Wie waer's mit <http://msdn.microsoft.com/en-us/library/aa373347.aspx>
>> statt der Kruecke "Dienst startet Applikation"?
>
> Der Java-Prozess ist ein Server ohne UI

Ohne UI (sprich: ohne unsichtbares Fenster) wuerde er aber kein WM_*
erhalten!
Ich verwende seit dem letzten Jahrtausend kein Java mehr, daher: gibt's
im JRE keinen fensterlosen Kommandozeilen"client", der als Windows-
Konsolenanwendung funktioniert?

> und sollte daher am ehesten selbst als Dienst laufen... wenn Du mir
> verrᅵtst, wie man einen Java-Prozess als richtigen Windows-Dienst

Definiere "Java-Prozess".
Offensichtlich meinst Du "Java-Interpreter-Prozess", sprich: Du muesstest
diesen Teil der JRE als Dienst umschreiben.

> laufen lᅵᅵt, dann mache ich das gerne. Bis dahin ist der Umweg ᅵber
> den Monitoring-Dienst leider unumgᅵnglich.

Einen Tod musst Du ganz offensichtlich sterben...

Daniel Weber

unread,
Jul 23, 2012, 3:48:20 PM7/23/12
to
Am 23.07.2012 16:50, schrieb Stefan Kanthak:
> "Daniel Weber" <use...@daniel-weber.eu> schrieb:
>> Das ist ein Java-Prozess, falls er WM_ENDSESSION auswertet kriegen wir
>> das nicht mit, wir sehen lediglich ein SIGTERM und einen Return Code 143.
>
> SIGTERM unter Windows?

Ja, die JVM bildet das, was sie von Windows bekommt, auf das
POSIX-Signal ab, was sie fᅵr am besten passend hᅵlt.

>> Der Java-Prozess ist ein Server ohne UI
>
> Ohne UI (sprich: ohne unsichtbares Fenster) wuerde er aber kein WM_*
> erhalten!

Mᅵglichweise erzeugt die JVM ein unsichtbares Fenster, um Nachrichten zu
verarbeiten.

> Ich verwende seit dem letzten Jahrtausend kein Java mehr, daher: gibt's
> im JRE keinen fensterlosen Kommandozeilen"client", der als Windows-
> Konsolenanwendung funktioniert?

Ja, es gibt neben javaw.exe noch java.exe fᅵr die reine Konsole. Ich
werde mir das morgen mal ansehen, ob es jetzt javaw.exe ist und ggf.
umstellen und schauen obs damit weg/anders ist.

> Definiere "Java-Prozess".
> Offensichtlich meinst Du "Java-Interpreter-Prozess", sprich: Du muesstest
> diesen Teil der JRE als Dienst umschreiben.

Nichts leichter als das. ;-)

Ciao,
Daniel
0 new messages