Daemon

Für Fragen rund um die Ide und zum Debugger
ABoehlke
Beiträge: 13
Registriert: Do 24. Jul 2008, 17:13

Daemon

Beitrag von ABoehlke »

Hi,

ich möchte einen daemon mit lazarus v0.9.24 beta unter ubuntu erstellen.
Ich habe mir hierzu auch die componente "lazdaemon.lpk 0.9.9" installiert.
Um möglichst schnell zu einem Ergebnis zu kommen habe ich mir das Example "cleandirs.lpi" etwas näher betrachtet, welches soweit verständlich ist.

Mein Problem ist, das wenn ich dieses, nachdem ich es übersetzthabe, mit "cleandirs -r" starte, blockiert es das Terminal bis ich mit STRG+C abbreche. Normaler weise bin ich der Meinung das das Programm starten müsste um danach sofort wieder den Prompt zur Verfügung zu stellen, eben im Hintergrund.

Hat hierzu vielleicht jemand einen Tipp?

Gruß, Axel

Benutzeravatar
theo
Beiträge: 10872
Registriert: Mo 11. Sep 2006, 19:01

Beitrag von theo »

Ein Daemon ist ein Ding das nicht nach dem Starten gleich wieder abbricht. Ein Webserver oder Mailserver ist ein Daemon. Die können Monate lang laufen.

Was Du meinst, ist ein simples Kommandozeilenprogramm.

ABoehlke
Beiträge: 13
Registriert: Do 24. Jul 2008, 17:13

daemon

Beitrag von ABoehlke »

Hallo theo,

vielleicht habe ich mich ja falsch ausgedrückt, aber ich meine kein "simples Kommandozeilenprogramm"!

Mir ist schon klar das die Aufgabe eines Daemon (1. Arbeiten im Hintergrund, 2. evtl. über einen längeren Zeitraum und 3. ohne ein Terminal "welches ich zum Aufruf nutze" zu belegen.

Das heißt, ich möchte den Daemon in einem Terminal starten "z.B. cleandirs -r", danach das Terminal schließen und der Daemon soll weiter seinen Dienst verrichten, bis er eben wieder Terminiert wird.

Dies passiert bei diesem Lazarusbeispiel aber nicht. Vielleicht mache ich ja auch etwas beim Start des Dienstes falsch?

Gruß, Axel

Socke
Lazarusforum e. V.
Beiträge: 3178
Registriert: Di 22. Jul 2008, 19:27
OS, Lazarus, FPC: Lazarus: SVN; FPC: svn; Win 10/Linux/Raspbian/openSUSE
CPU-Target: 32bit x86 armhf
Wohnort: Köln
Kontaktdaten:

Beitrag von Socke »

Guten Abend,
Das heißt, ich möchte den Daemon in einem Terminal starten "z.B. cleandirs -r", danach das Terminal schließen und der Daemon soll weiter seinen Dienst verrichten, bis er eben wieder Terminiert wird.
Um das in einem Programm hinzubekommen, habe ich auch keine Idee. Ein workaround könnte ein extra start/stopp-Programm sein:

Code: Alles auswählen

program startcleandirs
var p: TProcess;
    s: String;
    i: Integer;
begin
  s := '';
  for i := 1 to ParamCount do begin
    s := s+ParamStr(i);  // komadozeilenparameter übernehmen
  end;
  p := TProcess.Create(self);
  try
    p.CommandLine := 'cleandirs '+s;
    p.Execute;
  finally
    p.Free;
  end;
k.a. ob das so unter linux funktioniert, hab es nur mit dem TProcess und dem Windows-Rechner ausprobiert; hat funktioniert. Es ist in jedem Fall darauf zu achten, dass TProcess.Options nicht poWaitOnExit enthält, dann sollte das funktionieren.

Edit: Mir ist grad eingefallen, dass man das ganze ja auch in den eigentlichen Daemon mit einbauen könnte:

Code: Alles auswählen

// wenn du von TCustomApplication ableitest geht's so:
var app: TMyApplication  // von TCustomApplication abgeleitet
...
procedure TMyApplication.DoRun
begin
  if app.HasOption('start') then begin
    startdaemon;  // code von oben in einer Prozedur
    app.Halt;  // Programm beenden, da Daemon alleine läuft
  end;
end;
so, oder so ähnlich, bin mir mit den Parametern nicht ganz sicher.

MfG Die Socke

Benutzeravatar
theo
Beiträge: 10872
Registriert: Mo 11. Sep 2006, 19:01

Re: daemon

Beitrag von theo »

ABoehlke hat geschrieben:Hallo theo,
vielleicht habe ich mich ja falsch ausgedrückt, aber ich meine kein "simples Kommandozeilenprogramm"!

Dies passiert bei diesem Lazarusbeispiel aber nicht. Vielleicht mache ich ja auch etwas beim Start des Dienstes falsch?
Ich weiss ja nicht was du weisst oder nicht weisst.
Aber du weisst schon, dass man auf der Shell mit dem & am Schluss des Kommandos gleich wieder einen Prompt bekommt?
cleandirs -r &

Eb
Lazarusforum e. V.
Beiträge: 240
Registriert: Di 5. Feb 2008, 15:32
OS, Lazarus, FPC: Linux Mint - Laz 2.2.0
CPU-Target: 64Bit
Wohnort: Stuttgart

Beitrag von Eb »

Wenn du ein Programm im Terminal starten willst und danach das Terminal beenden, während das Programm weiterlaufen soll, kannst du das auch mit dem Parameter *&' machen.
Dadurch wird der Prozess zu einem HIntergrundprozess,
z.B.

Code: Alles auswählen

dhcppc1:~ # kwrite &
[1] 3933
dhcppc1:~ #
Falls man den Prozess wieder in den Vordergrund bringen will, gibts dafür auch einen Befehl - weiss ich aber grade nicht auswendig.

Eberhard

monta
Lazarusforum e. V.
Beiträge: 2809
Registriert: Sa 9. Sep 2006, 18:05
OS, Lazarus, FPC: Linux (L trunk FPC trunk)
CPU-Target: 64Bit
Wohnort: Dresden
Kontaktdaten:

Beitrag von monta »

Eb hat geschrieben:Falls man den Prozess wieder in den Vordergrund bringen will, gibts dafür auch einen Befehl - weiss ich aber grade nicht auswendig.
meinst du eventuell fg?
Johannes

Eb
Lazarusforum e. V.
Beiträge: 240
Registriert: Di 5. Feb 2008, 15:32
OS, Lazarus, FPC: Linux Mint - Laz 2.2.0
CPU-Target: 64Bit
Wohnort: Stuttgart

Beitrag von Eb »

exakt !

ABoehlke
Beiträge: 13
Registriert: Do 24. Jul 2008, 17:13

Daemon

Beitrag von ABoehlke »

Hi,

also all denen die mir mit Ihren Vorschlägen weitergeholfen haben möchte ich sagen "danke schön" es war dann wohl das "&" am ende der Commandline. :)

Nun aber noch eine Frage zu Daemons.

Was unterscheidet dann einen Daemon von einem Commandlineprogramm wenn beide durch "&" im Hintergrund laufen können?

Gruß, Axel

Benutzeravatar
theo
Beiträge: 10872
Registriert: Mo 11. Sep 2006, 19:01

Beitrag von theo »

Der Unterschied liegt afaik darin, dass ein Daemon typischerweise nicht mit stdin, stdout (Readln, Writeln) arbeitet also keine Konsole voraussetzt und beim Systemstart gestartet wird (Runlevel). Er sollte also auch auf Linux Messages wie SIGHUP oder SIGTERM hören.

pluto
Lazarusforum e. V.
Beiträge: 7192
Registriert: So 19. Nov 2006, 12:06
OS, Lazarus, FPC: Linux Mint 19.3
CPU-Target: AMD
Wohnort: Oldenburg(Oldenburg)

Beitrag von pluto »

heißt das jetzt das jedes Programm was auf SIGHUP und SIGTerm hört ein art Daemon ist ?
MFG
Michael Springwald

Christian
Beiträge: 6079
Registriert: Do 21. Sep 2006, 07:51
OS, Lazarus, FPC: iWinux (L 1.x.xy FPC 2.y.z)
CPU-Target: AVR,ARM,x86(-64)
Wohnort: Dessau
Kontaktdaten:

Beitrag von Christian »

Nein :).
W.m.k.A.h.e.m.F.h. -> http://www.gidf.de/

ABoehlke
Beiträge: 13
Registriert: Do 24. Jul 2008, 17:13

Daemon

Beitrag von ABoehlke »

ich habe zwischenzeitlich einiges über Daemons in Erfahrung bringen können. Unter anderem den Bericht aus der ToolBox 2/2007. Hier ist auch Beispielcode dabei.
Wenn ich diesen Übersetze, hat das Binary ca. eine Grösse von 1,2MB.
Wenn ich selbst in der selben Umgebung(Lazarus 0.9.24Beta) einen Daemon erzeuge welcher nichts tut und diesen übersetze, hat er eine Grösse von ca.12,4MB.

Kann mir vielleicht einer sagen warum das so ist, und was mann ggf. tun muss um das Binary kleiner zu kriegen?

hanibal
Beiträge: 369
Registriert: Sa 3. Mär 2007, 16:03
OS, Lazarus, FPC: Winux (L 0.9.xy FPC 2.2.z)
CPU-Target: xxBit
Wohnort: Bramsche (Emsland)

Beitrag von hanibal »

bei deiner lazarus installation ist ein progamm bei, das strip heist.

ansonsten einfacj die suchfunktion verwenden, da wirst du einiges finden ;)

ABoehlke
Beiträge: 13
Registriert: Do 24. Jul 2008, 17:13

Daemon

Beitrag von ABoehlke »

Hallo Hanibal,

ok, dannach ist es kleiner.
Warum aber ist dies bei dem Beispielprogramm nicht nötig?

Axel

Antworten