![]() |
Re: Eigener Dienst beendet nicht korrekt...
Zitat:
Delphi-Quellcode:
und zwar ist mit aufgefallen, dass nur teilweise "[] Service shutdown" erscheint...
2009-01-09 08:20:59 logfile created!
2009-01-09 08:20:59 Service successfully installed 2009-01-09 08:21:06 [administrator] logged in with IPAddress: 172.16.4.73 2009-01-09 08:21:06 [administrator] wrote "fast" logon info into database. 2009-01-09 08:21:26 [administrator] logged off 2009-01-09 08:23:05 [th21403] logged in with IPAddress: 172.16.4.73 2009-01-09 08:23:05 [th21403] wrote "full" logon info into database 2009-01-09 08:23:06 [th21403] 1 scan(s) has been automatically deleted! 2009-01-09 08:32:29 [th21403] logged off 2009-01-09 08:32:41 [ad_th21403] logged in with IPAddress: 172.16.4.73 2009-01-09 08:32:41 [ad_th21403] wrote "full" logon info into database 2009-01-09 08:35:32 [ad_th21403] logged off 2009-01-09 08:35:55 [ad_th21411] logged in with IPAddress: 172.16.4.73 2009-01-09 08:35:55 [ad_th21411] wrote "full" logon info into database 2009-01-09 08:37:51 [ad_th21411] logged off 2009-01-09 08:38:07 [th21403] logged in with IPAddress: 172.16.4.73 2009-01-09 08:38:07 [th21403] wrote "full" logon info into database 2009-01-09 08:38:07 [th21403] 1 scan(s) has been automatically deleted! 2009-01-09 08:39:09 [th21403] logged off 2009-01-09 08:39:11 [] Service shutdown 2009-01-09 09:10:35 [th21403] logged in with IPAddress: 172.16.4.73 2009-01-09 09:10:36 [th21403] wrote "full" logon info into database 2009-01-09 09:10:36 [th21403] 1 scan(s) has been automatically deleted! 2009-01-09 17:19:36 [th21403] logged off 2009-01-09 17:19:37 [] Service shutdown 2009-01-12 06:55:59 [th21403] logged in with IPAddress: 172.16.4.73 2009-01-12 06:56:01 [th21403] wrote "full" logon info into database 2009-01-12 06:56:01 [th21403] 1 scan(s) has been automatically deleted! 2009-01-12 15:58:19 [th21403] logged off 2009-01-12 15:58:20 [] Service shutdown 2009-01-13 06:54:55 [th21403] logged in with IPAddress: 172.16.4.73 2009-01-13 06:54:57 [th21403] wrote "full" logon info into database 2009-01-13 06:54:57 [th21403] 1 scan(s) has been automatically deleted! 2009-01-13 17:16:44 [th21403] logged off 2009-01-13 17:16:45 [] Service shutdown erscheint jetzt das nur wenn der dienst von windows abgewürgt wurde? trotzdem erhalte ich immer ein "logged off" was eigentlich bedeutet, dass das logoff erfolgreich geschrieben wurde, ist aber trotzdem nicht immer der Fall?! |
Re: Eigener Dienst beendet nicht korrekt...
Hallo,
Zitat:
|
Re: Eigener Dienst beendet nicht korrekt...
Ich hab jetzt mal eingebaut das Service Execute beendet wird wenn "onStop" oder "onShutdown" eintrifft. Das sieht aber ziemlich unschön aus, ist das wirklich die Lösung?
- bei meinen bisherigen Tests wurde zumindest bis jetzt das LogOout immer gemacht... - leider kommt es manchmal zu einem Fehler wenn ich per net stop den Dienst beende... aber ich konnte nicht lokalisieren an welcher stelle abgebrochen wird, trotz meiner {$IFDEF VERBOSE} ergänzung -> denn wenn die Meldung "Dienst konnte nicht beendet werden" kommt, wurde keine einzige meldung im log gemacht ab dem Zeitpunkt wo ich net stop eingebe...
Delphi-Quellcode:
Ich denke das hat so gar nichts bewirkt... das Problem scheint, so denke ich, immer noch dies zu sein:
procedure TMeinDienst.ServiceExecute(Sender: TService);
begin //ShowMessage('OnExecute - begin'); while not Terminated do begin TRY // try to catch a user {$IFDEF VERBOSE}LogFile.Log(msg0049+'- in try block');{$ENDIF} if ShutDownNow then Exit; if Username <> '' then begin // AUTOSCAN // THIS SECTION IS FOR USER WHO JUST LOGGED IN if (Username <> GetSession) or (Welcome = False) then begin if ShutDownNow then Exit; {$IFDEF VERBOSE}LogFile.Log(msg0049+'before change username');{$ENDIF} ChangeUser; {$IFDEF VERBOSE}LogFile.Log(msg0049+'after change username');{$ENDIF} if Username <> '' then // its important to get sure that the username has really been catched begin if ShutDownNow then Exit; {$IFDEF VERBOSE}LogFile.Log(msg0049+'username is not equal to ""');{$ENDIF} Welcome := True; LogFile.Log(msg0004+GetIPAddress); // check if the user already exists in the database CheckDBforUser(ADOQuery1,ADOStoredProc1); if ShutDownNow then Exit; // Save to database that the user is logged in UpdateUserInfo(Username, true); if ShutDownNow then Exit; // get all info from User Table "t_bb_user" ADOQuery3.Close; ADOQuery3.Parameters.ParamValues['@username'] := username; ADOQuery3.Open; if ShutDownNow then Exit; {$IFDEF VERBOSE}LogFile.Log(msg0049+'passed cdfu and uui');{$ENDIF} // If the logged in user is not on the blacklist it will autoscan now if CheckUserOnBlacklist(Username) = False then begin if ShutDownNow then Exit; // autostart scan now, but first get defined scan_type from db! case ADOQuery3scan_type.AsInteger of 0: begin ScanAndWriteToDB(True, stNoScanNoWrite); end; 1: begin ScanAndWriteToDB(True, stFullScanWriteJustRootFoldersSize); end; 2: begin ScanAndWriteToDB(True, stFullScanAndWrite); end; end; end else begin if ShutDownNow then Exit; // user is on blacklist, but login info will be saved ScanAndWriteToDB(True, stNoScanNoWrite); LogFile.Log(Username+msg0016); end; {$IFDEF VERBOSE}LogFile.Log(msg0049+'blacklist checked');{$ENDIF} // activate TCP server if ShutDownNow then Exit; if not assigned(TCPServer) then ActivateTCPServer; end; end else if StartManScan then begin {$IFDEF VERBOSE}LogFile.Log(msg0049+'man scan started');{$ENDIF} try // check if the user already exists in the database, else it will create him if Username <> '' then begin if ShutDownNow then Exit; CheckDBforUser(ADOQuery1,ADOStoredProc1); if ShutDownNow then Exit; ScanAndWriteToDB(False, stFullScanAndWrite); if ShutDownNow then Exit; end; finally // its very important to reset the variable StartManScan StartManScan := False; // send to the requesting host that the scan is complete now... Connect; TCPClient.IOHandler.WriteLn(IntToStr(CmdScanFinished)); // disconnect Disconnect; end; if ShutDownNow then Exit; end; end else begin {$IFDEF VERBOSE}LogFile.Log(msg0049+'username ');{$ENDIF} if ShutDownNow then Exit; ChangeUser; Welcome := False; end; EXCEPT on e:Exception do begin LogFile.LOG(msg0000+e.Message); // maby there are some tcp actions pending... Disconnect; if fulllog then LogFile.Log(msg0039); end; END; ServiceThread.ProcessRequests(False); if ShutDownNow then Exit; {$IFDEF VERBOSE}LogFile.Log(msg0049+'BEGIN SLEEP');{$ENDIF} Sleep(1000); {$IFDEF VERBOSE}LogFile.Log(msg0049+'END SLEEP');{$ENDIF} if ShutDownNow then Exit; end; //ShowMessage('OnExecute - end'); end; Zitat:
|
Re: Eigener Dienst beendet nicht korrekt...
Hallo,
in der Delphihilfe heißt es im Beispiel:
Delphi-Quellcode:
bei Dir jedoch
while not Terminated do begin
**ServiceThread.ProcessRequests(True); end;
Delphi-Quellcode:
Habe gerade meine 3einhalb Service durchgeschaut, bei mir heißt's immer
ServiceThread.ProcessRequests(False);
Delphi-Quellcode:
und die verhalten sich (nach meinem Dafürhalten) alle ordentlich. Versuch' es doch bitte mal damit.
ServiceThread.ProcessRequests(True)
Zitat:
|
Re: Eigener Dienst beendet nicht korrekt...
Zitat:
Die OnExecute Prozedur soll ja immer wieder ausgeführt werden, desshalb ist dort ja auch eine While Schliefe und ein Sleep(1000) drin. Oder mach ich dort grundsätzlich was falsch? |
Re: Eigener Dienst beendet nicht korrekt...
Hmm... Ich habs jetzt probeweise so gemacht:
Delphi-Quellcode:
ServiceThread.ProcessRequests(IsShuttingDownNow);
Die Variable IsShuttingDownNow ist von Anfang an auf False und wird dann in den Ereignissen OnStop und OnShutdown auf True gesetzt. Ist das richtig so?! |
Re: Eigener Dienst beendet nicht korrekt...
Wenn ich das recht verstehe ist das so:
ServiceThread.ProcessRequests(True); => Der Dienst wartet an dieser Stelle bis Messages da sind und bearbeitet diese dann ServiceThread.ProcessRequests(False); => Der Dienst verarbeitet Messages, wenn keine da sind macht er einfach weiter |
Re: Eigener Dienst beendet nicht korrekt...
Zitat:
|
Re: Eigener Dienst beendet nicht korrekt...
ich würde die nicht auf true setzen.
meine Dienste sehen idR so aus:
Delphi-Quellcode:
OnShutdown usw belege ich erstmal garnicht.
procedure TMyDienst.Execute;
begin while not terminated do begin //Irgendwas machen ServiceThread.ProcessRequests(False); end; end; Versuche dich mal ranzutasten wo bei dir das Problem liegt, also ein Minidienst machen und dann Stück für Stück einfügen und immerwieder zwischendurch testen obs geht |
Re: Eigener Dienst beendet nicht korrekt...
Zitat:
Beim starten des Dienst schreibt er in die Datenbank das er nun "online" ist. Beim Beenden schreibt er in die Datenbank das er nicht mehr "online" ist... Bis jetzt hatte ich ja eben auch immer auf False, aber dann schrieb er mir das LogOut manchmal nicht in die Datenbank. hmm ich teste mal und meld mich dann mit meinen Ergebnissen wieder... |
Alle Zeitangaben in WEZ +1. Es ist jetzt 04:13 Uhr. |
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 by Thomas Breitkreuz