Daemon
Daemon
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
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
daemon
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
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
-
- 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:
Guten Abend,
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:
so, oder so ähnlich, bin mir mit den Parametern nicht ganz sicher.
MfG Die Socke
Um das in einem Programm hinzubekommen, habe ich auch keine Idee. Ein workaround könnte ein extra start/stopp-Programm sein: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.
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;
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;
MfG Die Socke
Re: daemon
Ich weiss ja nicht was du weisst oder nicht weisst.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?
Aber du weisst schon, dass man auf der Shell mit dem & am Schluss des Kommandos gleich wieder einen Prompt bekommt?
cleandirs -r &
-
- 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
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.
Falls man den Prozess wieder in den Vordergrund bringen will, gibts dafür auch einen Befehl - weiss ich aber grade nicht auswendig.
Eberhard
Dadurch wird der Prozess zu einem HIntergrundprozess,
z.B.
Code: Alles auswählen
dhcppc1:~ # kwrite &
[1] 3933
dhcppc1:~ #
Eberhard
Daemon
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
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
Daemon
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?
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?