Delphi-PRAXiS
Seite 1 von 3  1 23      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Win32/Win64 API (native code) (https://www.delphipraxis.net/17-win32-win64-api-native-code/)
-   -   Delphi Dienst "Wiederherstellen"-Option einstellen (https://www.delphipraxis.net/84813-dienst-wiederherstellen-option-einstellen.html)

gsh 22. Jan 2007 11:11


Dienst "Wiederherstellen"-Option einstellen
 
Hi DPLer

ich möchte eigentlich das gleiche wie hier aber leider ist bei diesem thema ist keine antwort für mich rausgekommen.

Also nochmal fürs Protokoll: Ich programmiere einen Dienst der später auf einem Server laufen soll. D.h. er sollte die ganze Zeit durchlaufen. Da ich nur ein mensch bin :stupid: hat dieser Dienst sicher Fehler drinnen und jetzt möchte ich halt wenn der dienst abstürzt das der Dienst neu gestartet wird. Dies kann ich ja über die Option Wiederherstellen (In der dienstverwaltung -> unter Eigenschaften des Dienstes) erreichen. Nur wie schaff ich des der Dienst sich des selber einträgt?

gsh 23. Jan 2007 12:32

Re: Dienst "Wiederherstellen"-Option einstellen
 
*push* :feuerchen:

gsh 24. Jan 2007 13:44

Re: Dienst "Wiederherstellen"-Option einstellen
 
*push²* :duck:

Olli 25. Jan 2007 18:18

Re: Dienst "Wiederherstellen"-Option einstellen
 
Nunja, der Dienst kann schwerlich abstuerzen, wenn du SEH (try/except und try/finally) sinnvoll einsetzt. Daher sollte es ausreichen, wenn du es als Schleife konzipierst, ala:


Delphi-Quellcode:
while(ServiceRunning)do
try
// Hauptarbeit erledigen
except
// Fehler melden und naechsten Schleifendurchlauf angehen
end;

gsh 25. Jan 2007 19:35

Re: Dienst "Wiederherstellen"-Option einstellen
 
bringt mir gar nichts
Da das programm sehr leicht über den tcpserver und so weiter abstürzen kann.

Aber des ist ja auch egal wenn ich des alles über try except machen könnte dann würde ich ja nicht hier fragen
Außerdem ist es halt vorallem wichtig falls ich was vergessen hab zu sichern oder sonst was für ein problem auftritt das er ohne den benutzer neu startet

Olli 25. Jan 2007 19:44

Re: Dienst "Wiederherstellen"-Option einstellen
 
Zitat:

Zitat von gsh
Da das programm sehr leicht über den tcpserver und so weiter abstürzen kann.

Tcpserver? Aehem, du hast schon gelesen was ich geschrieben habe, oder? Ist doch piepegal ob innerhalb des try/except-Blocks was abstuerzt. Dann geht's eben weiter mit der naechsten Schleife. Service-Hauptfunktionen sind ohnehin ueblicherweise als Schleife implementiert. Es ist also ueberhaupt kein Problem, auch wenn du eins draus machen willst.

Oder reden wir hier von einem externen Prozess, mit dem dein Service kommuniziert?

Zitat:

Zitat von gsh
Aber des ist ja auch egal wenn ich des alles über try except machen könnte dann würde ich ja nicht hier fragen
Außerdem ist es halt vorallem wichtig falls ich was vergessen hab zu sichern oder sonst was für ein problem auftritt das er ohne den benutzer neu startet

Okay, wenn es nicht via SEH geht, dann hast du hier offenbar wichtige Fakten verschwiegen, die unabdingbar fuer eine sinnvolle Antwort sind. Das ist dann aber eher dein Problem.

gsh 25. Jan 2007 20:06

Re: Dienst "Wiederherstellen"-Option einstellen
 
Zitat:

Zitat von Olli
Tcpserver? Aehem, du hast schon gelesen was ich geschrieben habe, oder? Ist doch piepegal ob innerhalb des try/except-Blocks was abstuerzt. Dann geht's eben weiter mit der naechsten Schleife. Service-Hauptfunktionen sind ohnehin ueblicherweise als Schleife implementiert. Es ist also ueberhaupt kein Problem, auch wenn du eins draus machen willst.

ja schon aber den service kann ich nicht in eine schleife packen. Da ich mit dem tcp server ereigniss orientiert bin.

Zitat:

Zitat von Olli
Oder reden wir hier von einem externen Prozess, mit dem dein Service kommuniziert?

Weiss jetzt nicht genau was du meinst. Wenn du meinst des sich Clients auf dem server connecten und ab und zu mal ne message schicken worauf der server reagieren muss dann JA

Zitat:

Zitat von Olli
Okay, wenn es nicht via SEH geht, dann hast du hier offenbar wichtige Fakten verschwiegen, die unabdingbar fuer eine sinnvolle Antwort sind. Das ist dann aber eher dein Problem.

SEH? Wichtige Fakten vergessen? Wenn ich frag wie man die Wiederherstellungs Optionen einstellen kann, was brauchst du dann für Fakten?
Außerdem will ich dieses Wissen dann nicht nur für diesen Fall nutzen. Da ich mir sicher bin das ich noch andere Service schreiben werde wo ich des auch gut gebrauchen kann

Olli 25. Jan 2007 20:24

Re: Dienst "Wiederherstellen"-Option einstellen
 
Zitat:

Zitat von gsh
ja schon aber den service kann ich nicht in eine schleife packen. Da ich mit dem tcp server ereigniss orientiert bin.

Okay, an welcher Stelle kollidiert das jetzt mit meiner Aussage? Ich gehe mal davon aus, dass du eine TCP-Server-Komponente (Indy oder aehnliches) meinst. Dann wuerde der Absturz aber nach wie vor abgefangen und der "Server" (als neue Instanz) im naechsten Schleifendurchlauf neu erzeugt.

Zitat:

Zitat von gsh
Weiss jetzt nicht genau was du meinst. Wenn du meinst des sich Clients auf dem server connecten und ab und zu mal ne message schicken worauf der server reagieren muss dann JA

Nein, ich meine das was du als "TCP-Server" und das was du als "Dienst" bezeichnest. Sind das separate Prozesse?

Zitat:

Zitat von gsh
SEH?

Structured Exception Handling -> try/except und try/finally

Zitat:

Zitat von gsh
Wichtige Fakten vergessen? Wenn ich frag wie man die Wiederherstellungs Optionen einstellen kann, was brauchst du dann für Fakten?

Okay, was genau meinst du dann mit "Wiederherstellung-Optionen". Offenbar ein weiteres Missverstaendnis?! Ich habe NT-Dienste schon vor ueber 6 Jahren geschrieben aber davon noch nichts gehoert, weswegen es sich entweder um etwas Bekanntes unter neuem Namen oder um etwas neues und Unbekanntes handeln duerfte.

Zitat:

Zitat von gsh
Außerdem will ich dieses Wissen dann nicht nur für diesen Fall nutzen. Da ich mir sicher bin das ich noch andere Service schreiben werde wo ich des auch gut gebrauchen kann

Ja, genau deshalb solltest du robusten Code schreiben und SEH (sinnvoll) benutzen.

gsh 25. Jan 2007 20:44

Re: Dienst "Wiederherstellen"-Option einstellen
 
Zitat:

Zitat von Olli
Okay, an welcher Stelle kollidiert das jetzt mit meiner Aussage? Ich gehe mal davon aus, dass du eine TCP-Server-Komponente (Indy oder aehnliches) meinst. Dann wuerde der Absturz aber nach wie vor abgefangen und der "Server" (als neue Instanz) im naechsten Schleifendurchlauf neu erzeugt.

ja ich meine einen Indy server.
1. macht der Dienst nicht nur des.
2. wenn ich den server in deiner schleife auf active := true setzten würde dann würde er in einem anderen thread arbeiten anfangen und er würde die schleife weiter abarbeiten da kein fehler aufgetreten ist würde er wieder an den anfang der schleife springen und wieder den server auf True setzten. ... Ich glaub das wäre sehr schwer zu realiesieren und außerdem möchte ich nicht das die ganze zeit ein schleife durchläuft :roll:
3. Bevor mir da jetzt noch länger streiten. Es ist doch eigentlich egal was der dienst macht :|

Zitat:

Zitat von Olli
Nein, ich meine das was du als "TCP-Server" und das was du als "Dienst" bezeichnest. Sind das separate Prozesse?

Der TCP-Server ist ein idTCPServer (Indy) der als komponente auf dem Dienst läuft.

Zitat:

Zitat von Olli
Okay, was genau meinst du dann mit "Wiederherstellung-Optionen". Offenbar ein weiteres Missverstaendnis?! Ich habe NT-Dienste schon vor ueber 6 Jahren geschrieben aber davon noch nichts gehoert, weswegen es sich entweder um etwas Bekanntes unter neuem Namen oder um etwas neues und Unbekanntes handeln duerfte.

Geh mal Systemsteuerung -> Verwaltung -> Dienste
Dort klickst du auf einen dienst rechts drauf -> Eigenschaften
Dort gibt es einen Reiter "Wiederherstellung". Genau des meine ich

Zitat:

Zitat von Olli
Ja, genau deshalb solltest du robusten Code schreiben und SEH (sinnvoll) benutzen.

Ja das versuche ich ja, aber ich bin auch nur ein Mensch

Olli 25. Jan 2007 21:02

Re: Dienst "Wiederherstellen"-Option einstellen
 
Zitat:

Zitat von gsh
ja ich meine einen Indy server.
1. macht der Dienst nicht nur des.
2. wenn ich den server in deiner schleife auf active := true setzten würde dann würde er in einem anderen thread arbeiten anfangen und er würde die schleife weiter abarbeiten da kein fehler aufgetreten ist würde er wieder an den anfang der schleife springen und wieder den server auf True setzten. ... Ich glaub das wäre sehr schwer zu realiesieren und außerdem möchte ich nicht das die ganze zeit ein schleife durchläuft :roll:

Angenommen es ist in einem Thread (der ja seine eigene SEH-Sicherung von Windows bekommt), wuerde sich ja genau dieser Thread beenden. Damit waeren wir wieder am Ausgang unseres Gespraeches: du koenntest die Beendigung des Threads in einer Schleife mit WaitForSingleObject ueberwachen und darauf reagieren indem du den Thread neu startest oder eine neue Serverinstanz erzeugst.

Somit muesstest du noch nichtmal die Failure-Optionen setzen ... aber naja, scheint wohl eine Geschmacksfrage zu sein, ob man fuer die TCB robusten Code bevorzugt, oder lieber moegliche Sicherheitsloecher aufreisst.

Zitat:

Zitat von gsh
3. Bevor mir da jetzt noch länger streiten. Es ist doch eigentlich egal was der dienst macht :|

Stimmt genau.

Zitat:

Zitat von gsh
Geh mal Systemsteuerung -> Verwaltung -> Dienste
Dort klickst du auf einen dienst rechts drauf -> Eigenschaften
Dort gibt es einen Reiter "Wiederherstellung". Genau des meine ich

Ah, gut. Danke.

Dazu benutzt du MSDN-Library durchsuchenQueryServiceConfig2 und MSDN-Library durchsuchenChangeServiceConfig2 jeweils mit SERVICE_CONFIG_FAILURE_ACTIONS und der SERVICE_FAILURE_ACTIONS-Struktur. Sollte bei JEDI-Apilib enthalten sein ...

Zitat:

Zitat von gsh
Ja das versuche ich ja, aber ich bin auch nur ein Mensch

Sind wir doch alle :zwinker: ... soweit ich weiss *g*


Alle Zeitangaben in WEZ +1. Es ist jetzt 13:26 Uhr.
Seite 1 von 3  1 23      

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz