AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Programmieren allgemein Dienst, Service oder was? (D 2009 Prof)
Thema durchsuchen
Ansicht
Themen-Optionen

Dienst, Service oder was? (D 2009 Prof)

Ein Thema von stahli · begonnen am 12. Jun 2010 · letzter Beitrag vom 19. Jun 2010
Antwort Antwort
Seite 3 von 4     123 4      
Klaus01

Registriert seit: 30. Nov 2005
Ort: München
5.768 Beiträge
 
Delphi 10.4 Sydney
 
#21

AW: Dienst, Service oder was? (D 2009 Prof)

  Alt 15. Jun 2010, 21:45
Hallo Stahli,

ist die Fehlermeldung irgendwie hilfreich?
Oder steht da nur drinnen das der Service abgebrochen wurde?
Wo hast Du die Meldung gefunden - im Eventlog?

Grüße
Klaus
Klaus
  Mit Zitat antworten Zitat
Benutzerbild von stahli
stahli

Registriert seit: 26. Nov 2003
Ort: Halle/Saale
4.343 Beiträge
 
Delphi 11 Alexandria
 
#22

AW: Dienst, Service oder was? (D 2009 Prof)

  Alt 15. Jun 2010, 22:47
Beim Starten des Dienstes gibt es eine Progressbar und nach ein paar Sekunden erscheint die Fehlernachricht:
"Der Dienst xy auf LokalerComputer konnte nicht gestartet werden.
Fehler 1053: Der Dienst antwortete nicht rechtzeitig auf die Start- oder Steuerungsanforderung."

Die OnStart-Behandlung wird offenbar nicht ausgeführt, da ich meine dort auszugebende Message nicht erhalte.
Stahli
http://www.StahliSoft.de
---
"Jetzt muss ich seh´n, dass ich kein Denkfehler mach...!?" Dittsche (2004)
  Mit Zitat antworten Zitat
Benutzerbild von SirThornberry
SirThornberry
(Moderator)

Registriert seit: 23. Sep 2003
Ort: Bockwen
12.235 Beiträge
 
Delphi 2006 Professional
 
#23

AW: Dienst, Service oder was? (D 2009 Prof)

  Alt 16. Jun 2010, 08:13
Die OnStart-Behandlung wird offenbar nicht ausgeführt, da ich meine dort auszugebende Message nicht erhalte.
Wie gibst du die Message aus und unter welchem Betriebssystem? Hast du mal daran gedacht das eventuell deine Ausgabe der Message fehlschlägt aufgrund von fehlenden Berechtigungen bei einem Dienst und deswegen dein ganzer Dienst nicht startet?
Jens
Mit Source ist es wie mit Kunst - Hauptsache der Künstler versteht's
  Mit Zitat antworten Zitat
Benutzerbild von Bummi
Bummi

Registriert seit: 15. Jun 2010
Ort: Augsburg Bayern Süddeutschland
3.470 Beiträge
 
Delphi XE3 Enterprise
 
#24

AW: Dienst, Service oder was? (D 2009 Prof)

  Alt 16. Jun 2010, 11:02
Ich habe vor Einiger Zeit mal einen Apachewatcher geschrieben, der den Apachedienst neu starten soll wenn er hängt (kann auch www-publishingdienst sein).
Vieleicht kannst Du aus dem Code extrahieren was Du brauchst.

Konfuration über ini-datei:
[Settings]
URL=128.0.0.1
ServiceName=www-publishingdienst
IdleTimeSek=10
MaxErrorCount=3

Delphi-Quellcode:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Classes, Graphics, Controls, SvcMgr, Dialogs,WinSvc,inifiles,
  clTcpClient, clHttp, ExtCtrls,Shellapi;
type
  TWorkThreadThread = class(TThread)
  private
    procedure Check4Url;
    public
      procedure Execute; override;
  end;
  TApacheWatcher = class(TService)
    http: TclHttp;
    RestartTimer: TTimer;
    procedure ServiceStart(Sender: TService; var Started: Boolean);
    procedure ServiceContinue(Sender: TService; var Continued: Boolean);
    procedure ServicePause(Sender: TService; var Paused: Boolean);
    procedure ServiceStop(Sender: TService; var Stopped: Boolean);
    procedure ServiceCreate(Sender: TObject);
    procedure RestartTimerTimer(Sender: TObject);
  private
    WorkThreadThread:TWorkThreadThread;
    procedure ReadInifile;
    procedure WriteInifile;
    procedure WriteLog(const FLogMessage: String);
    procedure StartForeignService;
    procedure StopForeignService;
    procedure Restart;
    procedure Check4Url;
    { Private-Deklarationen }
  public
  FErrors:Integer;
    function GetServiceController: TServiceController; override;
    { Public-Deklarationen }
  end;

var
  ApacheWatcher: TApacheWatcher;
  G_SleepTime:Integer;
  G_Log:String;
  G_ErrorCount:Integer;
  G_IniFile :String;
  G_JobRunning:Boolean;
  G_URL:String;
  G_ServiceName:WideString;
  ss:SERVICE_STATUS;
  type
  TSStatus=Array[1..7] of String;
  Const
  SStatus:TSStatus=('SERVICE_STOPPED', 'SERVICE_START_PENDING', 'SERVICE_STOP_PENDING', 'SERVICE_RUNNING', 'SERVICE_CONTINUE_PENDING', 'SERVICE_PAUSE_PENDING', 'SERVICE_PAUSED');


implementation

{$R *.DFM}
Function TimeStamp:String;
begin
  Result := FormatDateTime('yyyymmdd hh:nn:ss ',Now);
end;

Procedure CheckFileSize(Const FN:String;MaxLen:Integer);
var
sr:TSearchrec;
sl:TStringList;
begin
  if FindFirst(FN,faAnyfile, sr)=0 then
     begin
     if SR.Size>MaxLen then
        begin
        sl:=TStringList.Create;
        sl.LoadFromFile(fn);
        while length(SL.Text)>(MaxLen div 2) do
              begin
              sl.Delete(0);
              end;
        sl[0]:='[clipped] '+TimeStamp;
        sl.SaveToFile(FN);
        end;
     end;
  FindClose(sr);
end;

Procedure TApacheWatcher.WriteLog(Const FLogMessage:String);
var
F:TextFile;
begin

if length(G_Log)>0 then
  begin
  try
    AssignFile(F, G_Log);
    if not Fileexists(G_Log) then Rewrite(F) else Append(F);
    Writeln(F,TimeStamp+': '+FLogMessage);
    CloseFile(F);
    CheckFileSize(G_Log,500000);
  except
  end;
  end;
end;


procedure TWorkThreadThread.Check4Url;
begin
    ApacheWatcher.Check4Url;
end;

procedure TWorkThreadThread.Execute;
begin

  while not Terminated do
  begin
    try
        Synchronize(Check4Url);
    except

    end;
    Sleep(1000*G_SleepTime);
  end;
end;



procedure ServiceController(CtrlCode: DWord); stdcall;
begin
  ApacheWatcher.Controller(CtrlCode);
end;


Procedure TApacheWatcher.Check4Url;
var
  sl:TStringList;
begin
   if not RestartTimer.Enabled then
   begin
     sl:=TStringList.Create;
     if (Length(G_URL)>0) and (Length(G_ServiceName)>0) then
        begin
         try
         Http.Close;
         Http.Get(G_URL, sl);
         except
           ON E:Exception DO WriteLog(E.Message);
         end;
         if Length(sl.Text) = 0 then inc(FErrors)
         else
            begin
            FErrors := 0;
            RestartTimer.Enabled := false;
            end;
         if FErrors > 0 then WriteLog('Error # :' + IntToStr(FErrors));
         if FErrors > G_ErrorCount then Restart;
        end;
     sl.Free;
   end;
end;

function TApacheWatcher.GetServiceController: TServiceController;
begin
  Result := ServiceController;
end;

procedure TApacheWatcher.ServiceContinue(Sender: TService;
  var Continued: Boolean);
begin
  ReadInifile;
  WriteLog('Service continued');
  WorkThreadThread.Resume;
  Continued := True;
end;

procedure TApacheWatcher.ServiceCreate(Sender: TObject);
begin
  G_Log:=ChangeFileExt(ParamStr(0) ,'.log');
  G_IniFile:=ChangeFileExt(ParamStr(0),'.ini');
  G_JobRunning:=false;
end;

procedure TApacheWatcher.ServicePause(Sender: TService; var Paused: Boolean);
begin
  WriteLog('Service paused');
  WorkThreadThread.Suspend;
  Paused := True;
end;

procedure TApacheWatcher.ServiceStart(Sender: TService; var Started: Boolean);
begin
  ReadInifile;
  WriteLog('Service started');
  WorkThreadThread:= TWorkThreadThread.Create(False);
  Started := True;
end;

procedure TApacheWatcher.ServiceStop(Sender: TService; var Stopped: Boolean);
begin
  WriteInifile;
  WriteLog('Service stopped');
  WorkThreadThread.Terminate;
  G_JobRunning:=false;
  Stopped := True;
end;


procedure TApacheWatcher.ReadInifile;
var
  ini:TInifile;
begin
  WriteLog( 'reading inifile: '+G_iniFile);
  ini:=TInifile.Create(G_iniFile);
  G_URL := ini.ReadString('Settings','URL','');
  G_ServiceName := ini.ReadString('Settings','ServiceName','');
  G_SleepTime := ini.ReadInteger('Settings','IdleTimeSek',10);
  G_ErrorCount := ini.ReadInteger('Settings','MaxErrorCount',3);
  ini.Free;
end;

procedure TApacheWatcher.RestartTimerTimer(Sender: TObject);
var
  V_SC_HANDLE:SC_HANDLE;
  V_SC_HANDLE2:SC_HANDLE;
  SName:WideString;
begin
  sName := G_ServiceName;
  V_SC_HANDLE:=OpenSCManager(nil,nil,SC_MANAGER_ALL_ACCESS);
  V_SC_HANDLE2:=OpenService(V_SC_HANDLE,PChar(SName),SERVICE_QUERY_STATUS);
  FErrors := 0;
  WriteLog('Wait for ' + G_ServiceName + ' shutdown');
  if QueryServiceStatus(V_SC_HANDLE2,ss) then
     begin
     if ss.dwCurrentState in [1,7] then
        begin
        WriteLog(Sname + ' shutdown confirmed');
        RestartTimer.Enabled:=false;
        StartForeignService;
        end;
     end;
  CloseServiceHandle(V_SC_HANDLE2);
  CloseServiceHandle(V_SC_HANDLE);
end;



procedure TApacheWatcher.StartForeignService;
begin
  WriteLog('Start ' + G_ServiceName);
  Shellexecute(0,'OPEN','net.exe',Pchar('start ' + G_ServiceName),nil,SW_Hide)
end;

procedure TApacheWatcher.StopForeignService;
begin
  WriteLog('Stop ' + G_ServiceName);
  Shellexecute(0,'OPEN','net.exe',Pchar('stop ' + G_ServiceName),nil,SW_Hide)
end;


procedure TApacheWatcher.WriteInifile;
var
  ini:TInifile;
begin
  ini:=TInifile.Create(G_inifile);
  ini.WriteString('Settings','URL',G_URL);
  ini.WriteString('Settings','ServiceName',G_ServiceName);
  ini.WriteInteger('Settings','IdleTimeSek',G_SleepTime);
  ini.WriteInteger('Settings','MaxErrorCount',G_ErrorCount);
  ini.Free;
end;

procedure TApacheWatcher.Restart;
begin

  StopForeignService;
  RestartTimer.Enabled:=true;
end;


end.
Thomas Wassermann H₂♂
Das Problem steckt meistens zwischen den Ohren
DRY DRY KISS
H₂ (wenn bei meinen Snipplets nichts anderes angegeben ist Lizenz: WTFPL)

Geändert von SirThornberry (16. Jun 2010 um 18:08 Uhr) Grund: umformatiert damit umgebrochen wird
  Mit Zitat antworten Zitat
Benutzerbild von stahli
stahli

Registriert seit: 26. Nov 2003
Ort: Halle/Saale
4.343 Beiträge
 
Delphi 11 Alexandria
 
#25

AW: Dienst, Service oder was? (D 2009 Prof)

  Alt 16. Jun 2010, 14:09
@SirThornberry: Ich nutze Win7 und für die Ausgabe ShowMessage. Während der Installation/Deinstallation funktionieren die Nachrichten. Ob ShowMessage in der OnStart-Behandlung stört, kann ich heute Abend mal testen.

@Bummi: Sollte denn meine Anforderung "zyklischer Beep" nun eigentlich mit einem nackigen TService, der von Hand installiert und gestartet wird möglich sein oder nicht?
Du hast Deine Hauptschleife ja in einem eigenen Thread laufen, nach anderen Beispielen sollte das aber wohl auch direkt in der OnExecute-Behandlung des TService gehen. Insofern wäre Deine Lösung (für meine Zwecke) vermutlich wohl zu umständlich.

Ich werde mal heute Abend noch etwas weiter testen...
Stahli
http://www.StahliSoft.de
---
"Jetzt muss ich seh´n, dass ich kein Denkfehler mach...!?" Dittsche (2004)
  Mit Zitat antworten Zitat
Benutzerbild von Bummi
Bummi

Registriert seit: 15. Jun 2010
Ort: Augsburg Bayern Süddeutschland
3.470 Beiträge
 
Delphi XE3 Enterprise
 
#26

AW: Dienst, Service oder was? (D 2009 Prof)

  Alt 16. Jun 2010, 14:20
Sollte denn meine Anforderung "zyklischer Beep" nun eigentlich mit einem nackigen TService, der von Hand installiert und gestartet wird möglich sein oder nicht?

>> ja


Du hast Deine Hauptschleife ja in einem eigenen Thread laufen, nach anderen Beispielen sollte das aber wohl auch direkt in der OnExecute-Behandlung des TService gehen.
>> ja, ich setze meine Dienste alleredings immer auf dem selben Template auf, welches seit ich in einem Dienst diverse IO's , Dateiübertragungen, Spooljobs und Druckausgaben parallel zu verarbeiten hatte immer zumindest einen Workerthread enthält
Thomas Wassermann H₂♂
Das Problem steckt meistens zwischen den Ohren
DRY DRY KISS
H₂ (wenn bei meinen Snipplets nichts anderes angegeben ist Lizenz: WTFPL)
  Mit Zitat antworten Zitat
Benutzerbild von stahli
stahli

Registriert seit: 26. Nov 2003
Ort: Halle/Saale
4.343 Beiträge
 
Delphi 11 Alexandria
 
#27

AW: Dienst, Service oder was? (D 2009 Prof)

  Alt 18. Jun 2010, 17:43
Ich komme einfach nicht weiter und lade mal eine kleine j.exe hoch.
Vielleicht kann es ja mal jemand testen, das als Service zu installieren und zu starten.
Die Installation wird mit Nachrichten porotokolliert und beim starten und ausführen sollten beep erzeugt werden, der Dienst lässt sich aber bei mir nicht starten.

Der komplette Quelltext:
Delphi-Quellcode:
unit sj;

interface

uses
  Windows, Messages, SysUtils, Classes, Graphics, Controls, SvcMgr, Dialogs;

type
  TServiceJ = class(TService)
    procedure ServiceExecute(Sender: TService);
    procedure ServiceAfterInstall(Sender: TService);
    procedure ServiceAfterUninstall(Sender: TService);
    procedure ServiceBeforeInstall(Sender: TService);
    procedure ServiceBeforeUninstall(Sender: TService);
    procedure ServiceContinue(Sender: TService; var Continued: Boolean);
    procedure ServiceCreate(Sender: TObject);
    procedure ServiceDestroy(Sender: TObject);
    procedure ServicePause(Sender: TService; var Paused: Boolean);
    procedure ServiceShutdown(Sender: TService);
    procedure ServiceStart(Sender: TService; var Started: Boolean);
    procedure ServiceStop(Sender: TService; var Stopped: Boolean);
  private
    { Private-Deklarationen }
  public
    function GetServiceController: TServiceController; override;
    { Public-Deklarationen }
  end;

var
  ServiceJ: TServiceJ;

implementation

{$R *.DFM}

procedure ServiceController(CtrlCode: DWord); stdcall;
begin
  ServiceJ.Controller(CtrlCode);
end;

function TServiceJ.GetServiceController: TServiceController;
begin
  Result := ServiceController;
end;

procedure TServiceJ.ServiceAfterInstall(Sender: TService);
begin
  ShowMessage('ServiceAfterInstall');
end;

procedure TServiceJ.ServiceAfterUninstall(Sender: TService);
begin
  ShowMessage('ServiceAfterUninstall');
end;

procedure TServiceJ.ServiceBeforeInstall(Sender: TService);
begin
  ShowMessage('ServiceBeforeInstall');
end;

procedure TServiceJ.ServiceBeforeUninstall(Sender: TService);
begin
  ShowMessage('ServiceBeforeUninstall');
end;

procedure TServiceJ.ServiceContinue(Sender: TService; var Continued: Boolean);
begin
  Beep;
end;

procedure TServiceJ.ServiceCreate(Sender: TObject);
begin
  ShowMessage('ServiceCreate');
end;

procedure TServiceJ.ServiceDestroy(Sender: TObject);
begin
  ShowMessage('ServiceDestroy');
end;

procedure TServiceJ.ServiceExecute(Sender: TService);
begin
  Beep;
  while not Terminated do
  begin
    ServiceThread.ProcessRequests(False); // wait for termination
    Sleep(1);
  end;
  Beep;
end;

procedure TServiceJ.ServicePause(Sender: TService; var Paused: Boolean);
begin
  Beep;
end;

procedure TServiceJ.ServiceShutdown(Sender: TService);
begin
  Beep;
end;

procedure TServiceJ.ServiceStart(Sender: TService; var Started: Boolean);
begin
  Beep;
end;

procedure TServiceJ.ServiceStop(Sender: TService; var Stopped: Boolean);
begin
  Beep;
end;

end.
Angehängte Dateien
Dateityp: zip j.zip (268,6 KB, 6x aufgerufen)
Stahli
http://www.StahliSoft.de
---
"Jetzt muss ich seh´n, dass ich kein Denkfehler mach...!?" Dittsche (2004)
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie

Registriert seit: 29. Mai 2002
37.621 Beiträge
 
Delphi 2006 Professional
 
#28

AW: Dienst, Service oder was? (D 2009 Prof)

  Alt 18. Jun 2010, 19:19
Wo wird da was protokolliert? Ich habe dir schon mal gesagt, dass du die ShowMessage Aufrufe nie sehen wirst, es sei denn du arbeitest noch unter Windows XP. Ab Windows Vista gibt es keine interaktiven Dienste mehr. Ein Dienst kann also kein Fenster auf dem Desktop des interaktiven Benutzers anzeigen.
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
Benutzerbild von stahli
stahli

Registriert seit: 26. Nov 2003
Ort: Halle/Saale
4.343 Beiträge
 
Delphi 11 Alexandria
 
#29

AW: Dienst, Service oder was? (D 2009 Prof)

  Alt 19. Jun 2010, 01:29
ShowMessage funktioniert beim Installieren und Deinstallieren.
Zur Dienst-Laufzeit habe ich testweise nur einen Beep verwendent. Ich werde mal noch ohne den Beep testen, ob der Dienst dann gestartet werden kann (der Dienst heisst übrigens "ServiceJ").
Wie kann man denn dann Nachrichten ausgeben? Dienste blenden ja unter Vista/Win7 immer kleine Fenster über der Symbolleiste ein.
Stahli
http://www.StahliSoft.de
---
"Jetzt muss ich seh´n, dass ich kein Denkfehler mach...!?" Dittsche (2004)
  Mit Zitat antworten Zitat
Benutzerbild von stahli
stahli

Registriert seit: 26. Nov 2003
Ort: Halle/Saale
4.343 Beiträge
 
Delphi 11 Alexandria
 
#30

AW: Dienst, Service oder was? (D 2009 Prof)

  Alt 19. Jun 2010, 01:54
Aha!
Ich habe die units SysUtils und Dialogs entfernt und alle ShowMessage und Beeps.
Jetzt lässt sich der Service starten, wobei ich halt keine "Einblicke" habe.

Jetzt muss ich noch einen zyklischen Website-Abruf regeln:
- Internet-Komponente (muss ich mich damit beschäftigen)
- Pausen (sollte sicher Sleep in der Schleife reichen)
und vor allem:
- eine AUSGABE, wenn die Website einen bestimmten Text enthält.

Wie kann man den letzten Punkt (unter Win7) realisieren?
Stahli
http://www.StahliSoft.de
---
"Jetzt muss ich seh´n, dass ich kein Denkfehler mach...!?" Dittsche (2004)
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 3 von 4     123 4      


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 19:34 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