AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren

Eigener Dienst beendet nicht korrekt...

Offene Frage von "cherry"
Ein Thema von cherry · begonnen am 15. Jan 2009 · letzter Beitrag vom 30. Apr 2009
Antwort Antwort
Seite 1 von 4  1 23     Letzte » 
Benutzerbild von cherry
cherry

Registriert seit: 14. Nov 2005
561 Beiträge
 
RAD-Studio 2009 Ent
 
#1

Eigener Dienst beendet nicht korrekt...

  Alt 15. Jan 2009, 08:54
Hi

Mein Dienst beendet manchmal korrekt, manchmal nicht. Nicht nur beim manuellen start/stop sondern auch beim Herunterfahren des PC's...

Wenn ich den Dienst manuell beende erhalte ich manchmal die Meldung: "Dienst konnte nicht beendet werden" und die Function "Update Userinfo" wird nicht mehr ausgeführt.

Beim Herunterfahren des PCs werden ja alle Dienste beendet, doch meiner scheint dies nicht korrekt zu tun, denn auch hier wird die Function "Update Userinfo" nicht immer ausgeführt.

Delphi-Quellcode:
procedure TMeinDienst.ServiceShutdown(Sender: TService);
begin
  UpdateUserInfo(Username, false);
  LogFile.LOG(msg0009);
end;
Hier das Execute...

Delphi-Quellcode:
procedure TMeinDienst.ServiceExecute(Sender: TService);
begin
  //ShowMessage('OnExecute - begin');
  while not Terminated do
  begin
    TRY
      // try to catch a user
      if Username <> 'then
      begin
        // AUTOSCAN
        // THIS SECTION IS FOR USER WHO JUST LOGGED IN
        if (Username <> GetSession) or (Welcome = False) then
        begin
          ChangeUser;
          if Username <> 'then // its important to get sure that the username has really been catched
          begin
            Welcome := True;
            LogFile.Log(msg0004+GetIPAddress);
            // check if the user already exists in the database
            CheckDBforUser(ADOQuery1,ADOStoredProc1);
            // Save to database that the user is logged in
            UpdateUserInfo(Username, true);
            // get all info from User Table "t_bb_user"
            ADOQuery3.Close;
            ADOQuery3.Parameters.ParamValues['@username'] := username;
            ADOQuery3.Open;

            // If the logged in user is not on the blacklist it will autoscan now
            if CheckUserOnBlacklist(Username) = False then
            begin
              // 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
              // user is on blacklist, but login info will be saved
              ScanAndWriteToDB(True, stNoScanNoWrite);
              LogFile.Log(Username+msg0016);
            end;

            // activate TCP server
            if not assigned(TCPServer) then
              ActivateTCPServer;

          end;
        end
        else if StartManScan then
        begin
          try
            // check if the user already exists in the database, else it will create him
            if Username <> 'then
            begin
              CheckDBforUser(ADOQuery1,ADOStoredProc1);
              ScanAndWriteToDB(False, stFullScanAndWrite);
            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;
        end;
      end
      else
      begin
        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);
      Sleep(1000);
  end;
  //ShowMessage('OnExecute - end');
end;
Bitte wirf doch mal ein Blick drauf.. PS: und wenn du gleich andere Sachen siehst die man anders strukturieren müsste, dann lass es mich wissen...

LG
Cherry
Ist das nur mein Gefühl, oder ist die ganze Welt verrückt geworden!?
  Mit Zitat antworten Zitat
franktron

Registriert seit: 11. Nov 2003
Ort: Oldenburg
1.446 Beiträge
 
Delphi 10.2 Tokyo Enterprise
 
#2

Re: Eigener Dienst beendet nicht korrekt...

  Alt 15. Jan 2009, 09:13
Greift

  UpdateUserInfo(Username, false); auf eine DB zu, wenn ja dann musst du die Abhängigkeiten für diesen Dienst änder.
Frank
Tux sein Lieblingsquellcode
While anzfische<TuxSatt do begin
Fisch:=TFisch.Create; Tux.EssenFisch(Fisch); Fisch.Free;inc(anzfische); end;
  Mit Zitat antworten Zitat
nahpets
(Gast)

n/a Beiträge
 
#3

Re: Eigener Dienst beendet nicht korrekt...

  Alt 15. Jan 2009, 09:17
Hallo,

Du greifst auf eine Datenbank zu, läuft die zufällig auf dem gleichen Rechner? Dann könnte es sein, dass die (zumindest beim Herunterfahren) vor Deinem Dienst beendet wurde.
Soweit ich weiß ist die Reihenfolge, in der Dienste beim Runterfahren beendet werden, nicht definiert, daher mal das: geht / geht nicht. Das ist natürlich keine Erklärung für das manuelle Stoppen des Dienstes.

Da Du eine Methode zum Loggen hast, schreib da mal etwas mehr mit in die Logdatei, z. B. vor jeden Funktions- bzw. Prozeduraufruf alaLogFile.Log(msg4711+'vor ADOQuery.Open'); Damit der Änderungsaufwand für diese Form des "von Hand debuggen" nicht zu groß wird, mache ich das meistens so:
Am Anfang der Unit steht ein{$DEFINE VERBOSE} das bei (hoffentlicher) Fehlerfreiheit auskommentiert wird. Das Loggen steht dann in der Form im Quelltext:
Delphi-Quellcode:
{$IFDEF VERBOSE}
LogFile.Log(msg4711+'vor ADOQuery.Open')
;{$ENDIF}
Eventuell solltest Du dem Try-Finally-Block noch einen zusätzlichen Try-Except-Block gönnen, um dort auftretende Fehler loggen zu können.
Ausgehend von Deinem geposteten Quelltext kann ich auf die Schnelle kein grundlegendes Problem erkennen. Da Du aber etliche Methoden aufrufst, könnte dort irgendwo ein "Hänger" sein, z. B. ein Timeout, dass höher ist, als die Wartezeit, die Deinem Dienst beim Beenden vom Betriebssystem gegönnt wird. Und wenn mehrere Methoden auf ein Timeout warten oder nur mit nicht allzu kurzen Wartezeiten zu tuen haben, könnte das zu diesem sporadischen Problem führen.
  Mit Zitat antworten Zitat
Benutzerbild von cherry
cherry

Registriert seit: 14. Nov 2005
561 Beiträge
 
RAD-Studio 2009 Ent
 
#4

Re: Eigener Dienst beendet nicht korrekt...

  Alt 15. Jan 2009, 09:30
Danke für die schnelle Antworten. Erstmal:

Zitat von nahpets:
Hallo,
Du greifst auf eine Datenbank zu, läuft die zufällig auf dem gleichen Rechner?
Ne, die MSSQL Datenbank läuft auf einem Server.

Zitat von franktron:
Greift
Delphi-Quellcode: markieren
UpdateUserInfo(Username, false);
auf eine DB zu, wenn ja dann musst du die Abhängigkeiten für diesen Dienst änder.
Ja tut es. Was für Abhängigkeiten meinst du? -Wie soll ich das realisieren...

Zitat von nahpets:
Da Du eine Methode zum Loggen hast, schreib da mal etwas mehr mit in die Logdatei, z. B. vor jeden Funktions- bzw. Prozeduraufruf ala...
Ok, da auch Ihr auf den ersten Blick keinen Fehler sieht, werde ich das Problem so mal probieren einzugrenzen.
Ist das nur mein Gefühl, oder ist die ganze Welt verrückt geworden!?
  Mit Zitat antworten Zitat
nahpets
(Gast)

n/a Beiträge
 
#5

Re: Eigener Dienst beendet nicht korrekt...

  Alt 15. Jan 2009, 09:53
Zitat von cherry:
Zitat von nahpets:
Du greifst auf eine Datenbank zu, läuft die zufällig auf dem gleichen Rechner?
Ne, die MSSQL Datenbank läuft auf einem Server.

Zitat von franktron:
Greift
Delphi-Quellcode: markieren
UpdateUserInfo(Username, false);
auf eine DB zu, wenn ja dann musst du die Abhängigkeiten für diesen Dienst änder.
Ja tut es. Was für Abhängigkeiten meinst du? -Wie soll ich das realisieren...

Zitat von nahpets:
Da Du eine Methode zum Loggen hast, schreib da mal etwas mehr mit in die Logdatei, z. B. vor jeden Funktions- bzw. Prozeduraufruf ala...
Ok, da auch Ihr auf den ersten Blick keinen Fehler sieht, werde ich das Problem so mal probieren einzugrenzen.
Was die Abhängigkeiten betrifft:
Nutzt Dein Dienst irgendwelche Daten (Dateien, Datenbanken, Server, Services...), die auf dem gleichen Rechner laufen? Wenn ja, musst Du sicherstellen, dass Dein Dienst vor den Anderen beendet wird. Die Datenbank dürfte hier jedoch schonmal nicht das Problem sein (da auf anderem Server).
Was macht z. B. ScanAndWriteToDB und mit wem unterhält sich TCPClient.IOHandler.WriteLn(IntToStr(CmdScanFinish ed))?
Sind das Sachen auf dem Rechner mit dem Dienst oder greifst Du auf andere Systeme zu?
Wer wird mit Connect angesprochen?

Dienstabhängigkeit einrichten unter Windows 2003 siehe hier:http://techpubs.borland.com/starteam...readme_de.html und auf der Seite nach "Dienstabhängigkeit" suchen.
  Mit Zitat antworten Zitat
Benutzerbild von cherry
cherry

Registriert seit: 14. Nov 2005
561 Beiträge
 
RAD-Studio 2009 Ent
 
#6

Re: Eigener Dienst beendet nicht korrekt...

  Alt 15. Jan 2009, 11:27
Zitat von nahpets:
Was die Abhängigkeiten betrifft:
Nutzt Dein Dienst irgendwelche Daten (Dateien, Datenbanken, Server, Services...), die auf dem gleichen Rechner laufen? Wenn ja, musst Du sicherstellen, dass Dein Dienst vor den Anderen beendet wird.

...Was macht z. B. ScanAndWriteToDB und mit wem unterhält sich TCPClient.IOHandler.WriteLn(IntToStr(CmdScanFinish ed))? ...
Naja, mein Dienst greifft auf folgende Ressourcen zu:

Lokal:
- Logfile auf "C:\Programme\MeinDienst\Logfile.log"
- Prozeduren die auf Lokale Dateien zugreiffen (nur Lesen) {ScanAndWriteToDB}
- Prozeduren die Registry Keys lesen (nur lesen)
- Prozedur die angemeldeten Benutzer ausliest

Extern:
- MSSQL DB {ScanAndWriteToDB}
- Auswertungsprogramm das von einem anderen Rechner aus läuft {TCP/IP}

Zitat von nahpets:
Dienstabhängigkeit einrichten unter Windows 2003 siehe hier:http://techpubs.borland.com/starteam...readme_de.html und auf der Seite nach "Dienstabhängigkeit" suchen.
Ich werde mir das mal anschauen
Ist das nur mein Gefühl, oder ist die ganze Welt verrückt geworden!?
  Mit Zitat antworten Zitat
Dezipaitor

Registriert seit: 14. Apr 2003
Ort: Stuttgart
1.701 Beiträge
 
Delphi 7 Professional
 
#7

Re: Eigener Dienst beendet nicht korrekt...

  Alt 15. Jan 2009, 12:04
ServiceShutdown wird nur aufgerufen, wenn der Dienst von außen beendet werden soll, aber nicht wenn er sich beendet.
In ServiceShutdown musst du deine Prozedur ServiceExecute veranlassen aus der while-Schleife zu springen.
Dann kannst du am Ende von ServiceExecute dein Logging machen.

Es sieht so aus, als ob es nur deshalb manchmal geht, weil Windows deinen Dienst abschießt, da er nicht schnell genug aus ServiceExecute austritt. Ich sehe nämlich garkein Endbedingung.
Christian
Windows, Tokens, Access Control List, Dateisicherheit, Desktop, Vista Elevation?
Goto: JEDI API LIB & Windows Security Code Library (JWSCL)
  Mit Zitat antworten Zitat
nahpets
(Gast)

n/a Beiträge
 
#8

Re: Eigener Dienst beendet nicht korrekt...

  Alt 15. Jan 2009, 12:45
Hallo,

verschieb mal Deine Methode
Delphi-Quellcode:
procedure TMeinDienst.ServiceShutdown(Sender: TService);
begin
  UpdateUserInfo(Username, false);
  LogFile.LOG(msg0009);
end;
nach
Delphi-Quellcode:
procedure TMeinDienst.ServiceStop(Sender: TService; var Stopped: Boolean);
begin
  UpdateUserInfo(Username, false);
  LogFile.LOG(msg0009);
  Stopped := True;
end;
  Mit Zitat antworten Zitat
Benutzerbild von cherry
cherry

Registriert seit: 14. Nov 2005
561 Beiträge
 
RAD-Studio 2009 Ent
 
#9

Re: Eigener Dienst beendet nicht korrekt...

  Alt 15. Jan 2009, 13:50
Zitat von nahpets:
Hallo,

verschieb mal Deine Methode
Delphi-Quellcode:
procedure TMeinDienst.ServiceShutdown(Sender: TService);
begin
  UpdateUserInfo(Username, false);
  LogFile.LOG(msg0009);
end;
nach
Delphi-Quellcode:
procedure TMeinDienst.ServiceStop(Sender: TService; var Stopped: Boolean);
begin
  UpdateUserInfo(Username, false);
  LogFile.LOG(msg0009);
  Stopped := True;
end;
an dem kanns leider nicht liegen, da ich das schon von anfang an auch dort implementiert habe!

Zitat von Dezipaitor:
ServiceShutdown wird nur aufgerufen, wenn der Dienst von außen beendet werden soll, aber nicht wenn er sich beendet.
In ServiceShutdown musst du deine Prozedur ServiceExecute veranlassen aus der while-Schleife zu springen.
Dann kannst du am Ende von ServiceExecute dein Logging machen.

Es sieht so aus, als ob es nur deshalb manchmal geht, weil Windows deinen Dienst abschießt, da er nicht schnell genug aus ServiceExecute austritt. Ich sehe nämlich garkein Endbedingung.
Das probiere ich gleich mal aus...
Ist das nur mein Gefühl, oder ist die ganze Welt verrückt geworden!?
  Mit Zitat antworten Zitat
Angel4585

Registriert seit: 4. Okt 2005
Ort: i.d.N.v. Freiburg im Breisgau
2.199 Beiträge
 
Delphi 2010 Professional
 
#10

Re: Eigener Dienst beendet nicht korrekt...

  Alt 15. Jan 2009, 13:54
hast du das da:

ServiceThread.ProcessRequests(False);

schonmal so hingeschrieben:

ServiceThread.ProcessRequests(True);

?

Edit: Ah ne das war ja was anderes -.-

Wie wäre es mit debuggen? Aus der IDE mit dem prozess verbinden und dann schauen was wo wie hängt
Martin Weber
Ich bin ein Rüsselmops
  Mit Zitat antworten Zitat
Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 06:55 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz