Lazarus Dienst (LazDaemon) unter Linux installieren und steuern

Nimral
Beiträge: 390
Registriert: Mi 10. Jun 2015, 11:33

Lazarus Dienst (LazDaemon) unter Linux installieren und steuern

Beitrag von Nimral »

Ich habe gerade meinen ersten Windows Service zusammengebaut. Klappt alles wie im Wiki beschrieben:

- man kompilere mit Lazarus
- man rufe die exe auf mit -install
- man verwende SC query, um den Dienst zu prüfen --> check,
- man verwende SC start und SC stop um den Dienst zu starten und zu stoppen --> geht auch.

Das reicht erst mal für meine Zwecke.

Jetzt versuche ich das Selbe unter Linux (Debian, Ubuntu) und beiße wieder mal auf Granit. Kompilieren ging, danach exe aufgerufen im Verzeichnis mit -install. Läuft durch ohne Fehlermeldung, und laut log macht das Teil zumindestens irgendwas.

Dann bin ich dieser Anleitung gefolgt ... https://wiki.freepascal.org/Daemons_and ... _SLES12.29 und habe mir eine .TestDaemon.services Datei gebastelt (btw ... was genau macht eigentlich -install, wenn nicht DAS?) und diese nach /lib/systemd/system/ kopiert:

Code: Alles auswählen

[Unit]
Description=Linux Test Daemon
After=network.target

[Service]
Type=simple
ExecStart=/home/linder/Dokumente/Programming/Lazarus/Tests/Daemon/TestDaemon -r
RemainAfterExit=yes
TimeoutSec=25

[Install]
WantedBy=multi-user.target
Danach ging auch

Code: Alles auswählen

sudo service TestDaemon start
vorher gab es noch eine Fehlermeldung wegen der fehlenden .service Datei.

Leider scheint der Daemon aber nicht richtig anzulaufen. Laut dem Log das er schreibt startet er, erzeugt auch ein TDaemon Objekt, danach bleibt er aber nicht resident und/oder bekommt kein Start signal.

--> ich muss wohl noch was machen, damit er richtig funktioniert?

Quellcode gibt es im Anhang. Läuft wie gesagt auf Windows, aber (noch) nicht auf Linux. Wäre toll wen sich das jemand anschaut, und natürlich fließt das zurück ins Wiki.

HG, Armin
Dateianhänge
TestDaemon.zip
(163.09 KiB) 115-mal heruntergeladen

Nimral
Beiträge: 390
Registriert: Mi 10. Jun 2015, 11:33

Re: Lazarus Dienst (LazDaemon) unter Linux installieren und steuern

Beitrag von Nimral »

Ich bin eins weiter!

Code: Alles auswählen

linder@Linder-Debian:~/Dokumente/Programming/Lazarus/Tests/Daemon$ sudo ./TestDaemon -r
This binary has no thread support compiled in.
Recompile the application with a thread-driver in the program uses clause before other units using thread.
Runtime error 232 at $000000000040E2FD
  $000000000040E2FD
  $000000000041CBA1
Aha! CThreads einbauen! Mach ich doch glatt & gleich :-)

Nimral
Beiträge: 390
Registriert: Mi 10. Jun 2015, 11:33

Re: Lazarus Dienst (LazDaemon) unter Linux installieren und steuern

Beitrag von Nimral »

Ok, es schaut besser aus!

CThreads war natürlich in der lpr Datei drinnen, macht Lazarus ja von selbst für jedes neue Projekt.

Code: Alles auswählen

Program TestDaemon;

Uses
{$IFDEF UNIX}{$IFDEF UseCThreads}
  CThreads,
{$ENDIF}{$ENDIF}
  DaemonApp, lazdaemonapp, DaemonMapperUnit1, DaemonUnit1
  { add your units here };

begin
  Application.Initialize;
  Application.Run;
end.
Ich hab das Conditional UseCThreads erst mal einfach entfernt, und nun klappt es, der Dienst läuft an und loggt. Ich habe irgendwo gelesen dass man das Conditional mit -dUseCThreads setzen kann, aber wozu ist es denn eigentlich gut? Mir scheint es erst mal eine unnötige Fehlerquelle ...

Armin.

Socke
Lazarusforum e. V.
Beiträge: 3158
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:

Re: Lazarus Dienst (LazDaemon) unter Linux installieren und steuern

Beitrag von Socke »

Nimral hat geschrieben:
Di 1. Feb 2022, 15:47
Ich habe irgendwo gelesen dass man das Conditional mit -dUseCThreads setzen kann, aber wozu ist es denn eigentlich gut? Mir scheint es erst mal eine unnötige Fehlerquelle ...
Ein Package kann -dUseCThreads für alle Projekte setzen, in denen es eingebunden wird. Wenn der Daemon das macht, sollte dessen Paket den Parameter setzen.
MfG Socke
Ein Gedicht braucht keinen Reim//Ich pack’ hier trotzdem einen rein

Nimral
Beiträge: 390
Registriert: Mi 10. Jun 2015, 11:33

Re: Lazarus Dienst (LazDaemon) unter Linux installieren und steuern

Beitrag von Nimral »

Scheint nicht zu tun, das Package ist ein unverändertes LazDaemon aus dem Package-Manager ...

(Lazarus 2.2.0RC2)

Socke
Lazarusforum e. V.
Beiträge: 3158
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:

Re: Lazarus Dienst (LazDaemon) unter Linux installieren und steuern

Beitrag von Socke »

Da wir uns einig erscheinen, dass es das tun sollte, habe ich mir erlaubt, ein Ticket zu erstellen: https://gitlab.com/freepascal.org/lazar ... sues/39625
MfG Socke
Ein Gedicht braucht keinen Reim//Ich pack’ hier trotzdem einen rein

Nimral
Beiträge: 390
Registriert: Mi 10. Jun 2015, 11:33

Re: Lazarus Dienst (LazDaemon) unter Linux installieren und steuern

Beitrag von Nimral »

Well done, Socke :-)

Ich nage im Moment immer noch an dem Dienst herum.

Ich starte ihn mit

Code: Alles auswählen

sudo TestDaemon -r
er läuft auch, aber das Terminal kommt nicht zurück.

Ich habe dann versucht, den Dienst von einem zweiten Terminal aus zu steuern:

Code: Alles auswählen

sudo service TestDaemon stop
darauf reagiert er nicht. Stoppe ich ihn allerdings in seinem "eigenen" Terminal mit Strg-C (16:07:41), bekommt er sein stop signal:

Code: Alles auswählen

16:07:18 Daemon object 1.0 created
16:07:18 Daemon received start signal
16:07:18 Daemon worker thread created
16:07:18 Daemon worker thread executing
16:07:18 Daemon worker thread running
16:07:23 Daemon worker thread running
16:07:28 Daemon worker thread running
16:07:33 Daemon worker thread running
16:07:38 Daemon worker thread running
16:07:41 Daemon received stop signal
16:07:41 Daemon worker thread terminated
16:07:42 Daemon stopped
16:07:42 Daemon object destroyed
Die Parameter -install und -uninstall scheinen ihn auch nicht groß zu interessieren, jedenfalls läuft er nach einem -uninstall (16:17:08) erst mal ungerührt weiter, ich habe ihn dann wieder mir Strg-C gestoppt (16:17:51) und kann den Daemon - ganz ohne -install - wieder mit -r starten und er läuft auch brav. wieder an (16:17:54).

Im Moment gehen meine Überlegungen dahin,. -install und -uninstall dazu zu verwenden, die .services Datei an Hand der Infos aus dem Mapper zu erzeugen bzw. zu löschen.

Was dann ber nichts daran ändert, dass das sudo service ... start und ...stop Kommando m.E. nicht funktioniert. Kann das jemand ggf bestätigen, ist das eventuell ein Problem das von der Distro abhängt ...

Armin.

Benutzeravatar
af0815
Lazarusforum e. V.
Beiträge: 6209
Registriert: So 7. Jan 2007, 10:20
OS, Lazarus, FPC: FPC fixes Lazarus fixes per fpcupdeluxe (win,linux,raspi)
CPU-Target: 32Bit (64Bit)
Wohnort: Burgenland
Kontaktdaten:

Re: Lazarus Dienst (LazDaemon) unter Linux installieren und steuern

Beitrag von af0815 »

was sagt 'ps xj' auf dem anderen Terminal ?

PPID sollte 1 sein und das TTY ? für den Dämon. Damit läuft der Dämon richtig detached vom TTY und hat den Hauptprozess als Eltern.

BTW: Hier vielleicht ein paar Ideen dazu

https://forum.lazarus.freepascal.org/in ... ic=22983.0
Blöd kann man ruhig sein, nur zu Helfen muss man sich wissen (oder nachsehen in LazInfos/LazSnippets).

Nimral
Beiträge: 390
Registriert: Mi 10. Jun 2015, 11:33

Re: Lazarus Dienst (LazDaemon) unter Linux installieren und steuern

Beitrag von Nimral »

Der TestDaemon taucht in der ps xl Liste nicht auf, er läuft aber schön brav, jedenfalls schreibt er wie ihm aufgetragen alle 5 Sekunden in die Log-Datei.

Ich habe mir noch schnell die Process- und Thread-IDs ins log schreiben lassen:

Code: Alles auswählen

17:14:48 Daemon object 1.1 created, PID:7737
17:14:48 Daemon received start signal
17:14:48 Daemon worker thread created
17:14:48 Daemon worker thread executing, TID:140517887878912
17:14:48 Daemon worker thread running
17:14:53 Daemon worker thread running
...
PID 7737 taucht in der Liste von PS definitiv nicht auf.

Code: Alles auswählen

0  1000   7582   2978  20   0   7908  4752 -      Ss   pts/2      0:00 bash
0  1000   7702   1535  39   - 1237772 40676 x64_sy SNsl ?         0:05 /usr/lib/tracker/tracker-extract
0  1000   7903   7582  20   0  10548  1268 -      R+   pts/2      0:00 ps xl

Nimral
Beiträge: 390
Registriert: Mi 10. Jun 2015, 11:33

Re: Lazarus Dienst (LazDaemon) unter Linux installieren und steuern

Beitrag von Nimral »

Hab ihn!

Ich muss ps mit sudo ausführen.

Code: Alles auswählen

1     0   7196      2  20   0      0     0 -      I    ?          0:00 [kworker/1:0-events]
4     0   7736   2983  20   0  10328  4040 x64_sy S+   pts/0      0:00 sudo ./TestDaemon -run
4     0   7737   7736  20   0 146132  2676 -      Sl+  pts/0      0:00 ./TestDaemon -run
1     0   7872      2  20   0      0     0 -      I    ?          0:00 [kworker/0:1-events_power_efficient]
4     0   8070   7582  20   0  10572  4212 x64_sy S+   pts/2      0:00 sudo ps xl
4     0   8074   8070  20   0  10548  1272 -      R+   pts/2      0:00 ps xl

Armin.

Nimral
Beiträge: 390
Registriert: Mi 10. Jun 2015, 11:33

Re: Lazarus Dienst (LazDaemon) unter Linux installieren und steuern

Beitrag von Nimral »

Es wird immer abenteuerlicher.

Code: Alles auswählen

linder@Linder-Debian:~/Dokumente/Programming/Lazarus/Tests/Daemon$ sudo service TestDaemon status
● TestDaemon.service - Linux Test Daemon
   Loaded: loaded (/lib/systemd/system/TestDaemon.service; disabled; vendor preset: enabled)
   Active: inactive (dead)

Feb 01 15:51:33 Linder-Debian systemd[1]: TestDaemon.service: Succeeded.
Feb 01 15:51:33 Linder-Debian systemd[1]: Stopped Linux Test Daemon.
Feb 01 15:52:22 Linder-Debian systemd[1]: Started Linux Test Daemon.
Feb 01 15:52:59 Linder-Debian systemd[1]: Stopping Linux Test Daemon...
Feb 01 15:52:59 Linder-Debian systemd[1]: TestDaemon.service: Succeeded.
Feb 01 15:52:59 Linder-Debian systemd[1]: Stopped Linux Test Daemon.
Feb 01 17:34:35 Linder-Debian systemd[1]: Started Linux Test Daemon.
Feb 01 17:35:16 Linder-Debian systemd[1]: Stopping Linux Test Daemon...
Feb 01 17:35:16 Linder-Debian systemd[1]: TestDaemon.service: Succeeded.
Feb 01 17:35:16 Linder-Debian systemd[1]: Stopped Linux Test Daemon.
linder@Linder-Debian:~/Dokumente/Programming/Lazarus/Tests/Daemon$ sudo service TestDaemon start
linder@Linder-Debian:~/Dokumente/Programming/Lazarus/Tests/Daemon$ sudo service TestDaemon status
● TestDaemon.service - Linux Test Daemon
   Loaded: loaded (/lib/systemd/system/TestDaemon.service; disabled; vendor preset: enabled)
   Active: active (running) since Tue 2022-02-01 17:36:02 CET; 4s ago
 Main PID: 8702 (TestDaemon)
    Tasks: 3 (limit: 4661)
   Memory: 1.0M
   CGroup: /system.slice/TestDaemon.service
           └─8702 /home/linder/Dokumente/Programming/Lazarus/Tests/Daemon/TestDaemon -r

Feb 01 17:36:02 Linder-Debian systemd[1]: Started Linux Test Daemon.
linder@Linder-Debian:~/Dokumente/Programming/Lazarus/Tests/Daemon$ sudo service TestDaemon stop
linder@Linder-Debian:~/Dokumente/Programming/Lazarus/Tests/Daemon$ sudo service TestDaemon status
● TestDaemon.service - Linux Test Daemon
   Loaded: loaded (/lib/systemd/system/TestDaemon.service; disabled; vendor preset: enabled)
   Active: inactive (dead)

Feb 01 15:52:59 Linder-Debian systemd[1]: TestDaemon.service: Succeeded.
Feb 01 15:52:59 Linder-Debian systemd[1]: Stopped Linux Test Daemon.
Feb 01 17:34:35 Linder-Debian systemd[1]: Started Linux Test Daemon.
Feb 01 17:35:16 Linder-Debian systemd[1]: Stopping Linux Test Daemon...
Feb 01 17:35:16 Linder-Debian systemd[1]: TestDaemon.service: Succeeded.
Feb 01 17:35:16 Linder-Debian systemd[1]: Stopped Linux Test Daemon.
Feb 01 17:36:02 Linder-Debian systemd[1]: Started Linux Test Daemon.
Feb 01 17:36:15 Linder-Debian systemd[1]: Stopping Linux Test Daemon...
Feb 01 17:36:15 Linder-Debian systemd[1]: TestDaemon.service: Succeeded.
Feb 01 17:36:15 Linder-Debian systemd[1]: Stopped Linux Test Daemon.
linder@Linder-Debian:~/Dokumente/Programming/Lazarus/Tests/Daemon$ 
Soweit scheint für das Linux "service" Tool alles in Butter. Nur nicht ganz: der Dienst ist schon gelaufen, bevor "service start" gegeben wurde, er lief die ganze Zeit, und er lief auch nach dem "service stop" weiter, weil er ja nach wie vor nicht auf start und stop Kommandos reagiert. Das was "service status" erzählt hat also mit dem wirklichen Status des Dienstes nichts zu tun.

Socke
Lazarusforum e. V.
Beiträge: 3158
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:

Re: Lazarus Dienst (LazDaemon) unter Linux installieren und steuern

Beitrag von Socke »

Nimral hat geschrieben:
Di 1. Feb 2022, 16:13
Ich starte ihn mit

Code: Alles auswählen

sudo TestDaemon -r
er läuft auch, aber das Terminal kommt nicht zurück.
Wenn du ihn so auf einem Terminal startest, kann systemd (System-Daemon, der alle Dienste verwaltet) dein Programm nicht kontrollieren. Er weiß ja nichts davon, zu welchem Dienst dieser gehört.
D.h. startest du deinen Daemon manuell, musst du ihn auch manuell beenden. Startest du ihn über systemd (z.B. per Befehl service oder systemctl), solltest du ihn auch darüber beenden.

Normalerweise musst du deinen Daemon erst aktivieren:
systemctl enable TestDaemon.services
Erst danach funktionieren Start/Stopp zuverlässig.
Änderst du die TestDaemon.services Datei, kannst du sie per systemctl daemon-reload neu laden (lädt alle geänderten sog. systemd-Units neu).
MfG Socke
Ein Gedicht braucht keinen Reim//Ich pack’ hier trotzdem einen rein

Benutzeravatar
Winni
Beiträge: 1577
Registriert: Mo 2. Mär 2009, 16:45
OS, Lazarus, FPC: Laz2.2.2, fpc 3.2.2
CPU-Target: 64Bit
Wohnort: Fast Dänemark

Re: Lazarus Dienst (LazDaemon) unter Linux installieren und steuern

Beitrag von Winni »

@Socke

Ja - das tat Not. Danke.

Etwas Linux Grundwissen sollte schon vorhanden sein, wenn man einen demon (korrekte Schreibweise) programmieren will.

Winni

PascalDragon
Beiträge: 830
Registriert: Mi 3. Jun 2020, 07:18
OS, Lazarus, FPC: L 2.0.8, FPC Trunk, OS Win/Linux
CPU-Target: Aarch64 bis Z80 ;)
Wohnort: München

Re: Lazarus Dienst (LazDaemon) unter Linux installieren und steuern

Beitrag von PascalDragon »

Nimral hat geschrieben:
Di 1. Feb 2022, 15:47
Ich hab das Conditional UseCThreads erst mal einfach entfernt, und nun klappt es, der Dienst läuft an und loggt. Ich habe irgendwo gelesen dass man das Conditional mit -dUseCThreads setzen kann, aber wozu ist es denn eigentlich gut? Mir scheint es erst mal eine unnötige Fehlerquelle ...
FPC linkt unter Linux standardmäßig nicht gegen die C-Bibliothek, wodurch die Anwendungen kompatibler mit verschiedenen Linux Versionen sind. Die cthreads-Unit - wie der Name andeutet - macht dies aber. Deshalb wird dies standardmäßig nicht von selbst aktiviert. In manchen Situationen ist es jedoch sinnvoll dies standardmäßig zu haben, wie beim Lazarus Daemon Projekt, wo ja Threads standardmäßig verwendet werden.
Nimral hat geschrieben:
Di 1. Feb 2022, 15:47
Die Parameter -install und -uninstall scheinen ihn auch nicht groß zu interessieren, jedenfalls läuft er nach einem -uninstall (16:17:08) erst mal ungerührt weiter, ich habe ihn dann wieder mir Strg-C gestoppt (16:17:51) und kann den Daemon - ganz ohne -install - wieder mit -r starten und er läuft auch brav. wieder an (16:17:54).

Im Moment gehen meine Überlegungen dahin,. -install und -uninstall dazu zu verwenden, die .services Datei an Hand der Infos aus dem Mapper zu erzeugen bzw. zu löschen.
Die install und uninstall Aktionen werden unter *nix nicht verwendet, da hier teilweise jede Distro ihr eigenes Süppchen kocht und man eigentlich auch noch zwischen dem alten Sys V Init System und systemd unterscheiden muss. Niemand hindert dich allerdings daran die Aktionen für dich zu nutzen. ;)
Nimral hat geschrieben:
Di 1. Feb 2022, 15:47
Was dann ber nichts daran ändert, dass das sudo service ... start und ...stop Kommando m.E. nicht funktioniert. Kann das jemand ggf bestätigen, ist das eventuell ein Problem das von der Distro abhängt ...
Die Daemon Funktionalität stammt noch aus der Zeit des Sys V Init Systems, es kann also sein, dass dies mit systemd nicht richtig funktioniert. Vielleicht reicht es, wenn du in der .service-Datei korrekt angibst, wie der Daemon gestoppt werden muss...
FPC Compiler Entwickler

Nimral
Beiträge: 390
Registriert: Mi 10. Jun 2015, 11:33

Re: Lazarus Dienst (LazDaemon) unter Linux installieren und steuern

Beitrag von Nimral »

Winni hat geschrieben:
Di 1. Feb 2022, 22:33
@Socke

Ja - das tat Not. Danke.

Etwas Linux Grundwissen sollte schon vorhanden sein, wenn man einen demon (korrekte Schreibweise) programmieren will.

Winni
Sehe ich auch so. Nun, ich komme von WIndows, das ist kein Geheimnis. Und jeder beginnt irgendwann als Anfänger, wenn er etwas Neues anfasst, das ist keine Schande.

Ich hätte erwartet, dass diese Dinge im Wiki beschrieben sind, aber da liegen nur ein paar reichlich nutzlose Brocken rum, das IST eine Schande.

--> https://wiki.freepascal.org/Daemons_and ... _Debian.29

Lasst es uns besser machen. PascalDragon hat ja einiges auf den Tisch gelegt das die Dinge erklärt, und was dringend da rein gehört. Und ich ziehe parallel zu meinem Wissenszuwachs das Wiki nach, vielleicht kann ich einen von euch als Gegenleser gewinnen für den Fall, dass mir Fehler unterlaufen. Im Moment habe ich vor, tatsächlich die -install und -uninstall Parameter zu nützen um die .service Datei zu verwalten..

Im Übrigen danke ich Socke und PascalDragon für die nützlichen Hinweise, ich hab noch Termine bis Mittag, dann setze ich mich wieder an das Problem.

Armin.

"Daemon" ist wohl so gebräuchlich, dass man es verwenden darf ohne bekritelt zu werden (--> Wikipedia: https://de.wikipedia.org/wiki/Daemon)

Antworten