Erstellen eines Daemons und unix

Für Fragen zur Programmiersprache auf welcher Lazarus aufbaut
DD50
Beiträge: 27
Registriert: Do 13. Sep 2012, 12:48

Erstellen eines Daemons und unix

Beitrag von DD50 »

Hi,
ich versuche einen Daemon unter unix zu machen. Leider finde ich nur Beispiele für Windows, die logischerweise nicht laufen. Kann mir vielleicht jemand ein Beispiel sagen, bzw. wo ich sowas finde?

Toll wäre natürlich ein Codesnipsel ;)

mschnell
Beiträge: 3444
Registriert: Mo 11. Sep 2006, 10:24
OS, Lazarus, FPC: svn (Window32, Linux x64, Linux ARM (QNAP) (cross+nativ)
CPU-Target: X32 / X64 / ARMv5
Wohnort: Krefeld

Re: Erstellen eines Daemons und unix

Beitrag von mschnell »

DD50 hat geschrieben:ich versuche einen Daemon unter unix zu machen.
Ein Programm kann sich selber "daeminizen". Ich meine mich zu erinnern, dass eine Funktion dafür in der LCL oder RTL existert. Ich bin aber nicht sicher.

Du kannst aber auch das Programm einfach in einem Script mit "programmname parameter &" aufrufen. Dann startet Bash es als daemon.

Das geht natürlich nur für Programme, die keine Oberfläche haben (also "new Programm" und nicht "new Application"). Lazarus "Programme" haben gegenüber Lazarus "Applicatios" leider gewaltige Einschränkungen (z.B. kannst Du keinen TTimer verwenden, nicht "TThread.Synchronize" und nicht Application.WQueuAsyncCall).

-Michael

DD50
Beiträge: 27
Registriert: Do 13. Sep 2012, 12:48

Re: Erstellen eines Daemons und unix

Beitrag von DD50 »

Mit & starte ich es im moment. Ich finde das allerding nicht so "sauber". Ein "richtiger" daemon kann ja (wenn man es ihm beibringt) auch einen restart usw.

Scotty
Beiträge: 768
Registriert: Mo 4. Mai 2009, 13:24
OS, Lazarus, FPC: Arch Linux, Lazarus 1.3 r44426M FPC 2.6.4
CPU-Target: x86_64-linux-qt/gtk2
Kontaktdaten:

Re: Erstellen eines Daemons und unix

Beitrag von Scotty »

Wenn der Prozess im Hintergrund läuft (mit & starten oder per Strg-Z +bg verschieben), ist er noch immer an das Terminal gebunden und würde beim Schließen terminiert werden. Man kann sich mit dem Programm screen behelfen. Oder einen Deamon schreiben - wozu ich bisher aber zu faul war und eher wenig beitragen kann. Aber die Beispiele unter Examples habe ich mir schon angesehen, und die laufen unter Linux. Sehen allerdings recht komplex aus.

mschnell
Beiträge: 3444
Registriert: Mo 11. Sep 2006, 10:24
OS, Lazarus, FPC: svn (Window32, Linux x64, Linux ARM (QNAP) (cross+nativ)
CPU-Target: X32 / X64 / ARMv5
Wohnort: Krefeld

Re: Erstellen eines Daemons und unix

Beitrag von mschnell »

DD50 hat geschrieben:Mit & starte ich es im moment. Ich finde das allerding nicht so "sauber". Ein "richtiger" daemon kann ja (wenn man es ihm beibringt) auch einen restart usw.
Die beiden Aspekte (self-daemonizing statt "&" und Restart haben nichts mit einander zu tun.

Wenn Du ein Programm als "richtigen" daemon laufen lassen willst, musst Du es beim System-Start aufrufen lassen, statt von einem "Terminal" . Ob das nun in einem Script mit & gemacht wird oder anders ist egal.

Du kannst es (z.B. mit "&") in das init-Script ("rc") integrieren oder Du kannst es in initab schreiben, damit es automatisch gestartet und ge-restartet wird. Ein Programm wird durch initab immer ein Daemon, Da brauchst Du im Programm keine Vorkehrengen treffen.

-Michael

Scotty
Beiträge: 768
Registriert: Mo 4. Mai 2009, 13:24
OS, Lazarus, FPC: Arch Linux, Lazarus 1.3 r44426M FPC 2.6.4
CPU-Target: x86_64-linux-qt/gtk2
Kontaktdaten:

Re: Erstellen eines Daemons und unix

Beitrag von Scotty »

mschnell hat geschrieben:Wenn Du ein Programm als "richtigen" daemon laufen lassen willst, musst Du es beim System-Start aufrufen lassen, statt von einem "Terminal".
Das ist genauso falsch wie die anderen Aussagen.

Back to topic: Unter ../Lazarus/examples/cleandirs ist ein Beispiel für einen Daemon.

DD50
Beiträge: 27
Registriert: Do 13. Sep 2012, 12:48

Re: Erstellen eines Daemons und unix

Beitrag von DD50 »

Scotty hat geschrieben:Back to topic: Unter ../Lazarus/examples/cleandirs ist ein Beispiel für einen Daemon.
Das hatte ich schon gefunden. Aber dann muss ich wohl erstmal die allerneuste fpc version draufmachen. Ich habe die fpc_2.6.0-120824_i386 drauf.

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:

Re: Erstellen eines Daemons und unix

Beitrag von Socke »

DD50 hat geschrieben:Mit & starte ich es im moment. Ich finde das allerding nicht so "sauber".
Direkt nach Programmstart führst du ein fork() durch. Den Elternprozess lässt du einfach terminieren. Der Kindprozess läuft dann als Daemon weiter. Der Systemcall fork() ist in der Funktion fpfork() in der Unit unix oder baseunix implementiert.
DD50 hat geschrieben:Ein "richtiger" daemon kann ja (wenn man es ihm beibringt) auch einen restart usw.
Dazu legst du die Prozess-ID in einer Datei unter /run/<programmname>.pid ab. Damit kannst du dann Signale an deinen Daemon senden (dieser muss die entsprechenden Signal-Handler registrieren).
DD50 hat geschrieben:
Scotty hat geschrieben:Back to topic: Unter ../Lazarus/examples/cleandirs ist ein Beispiel für einen Daemon.
Das hatte ich schon gefunden. Aber dann muss ich wohl erstmal die allerneuste fpc version draufmachen. Ich habe die fpc_2.6.0-120824_i386 drauf.
Hier werden eigene FPC/Lazarus-Klassen, durch die Verwaltungsaufgaben (starten, stoppen, registrieren, etc.) für Unix und Windows umgesetzt werden, verwendet. Damit sind sie eine plattformunabhängige Alternative zu dem oben beschriebenen Vorgehen. Mit dem FPC 2.6.0 kann ich das Projekt wunderbar übersetzen (getestet habe ich nicht).
MfG Socke
Ein Gedicht braucht keinen Reim//Ich pack’ hier trotzdem einen rein

mschnell
Beiträge: 3444
Registriert: Mo 11. Sep 2006, 10:24
OS, Lazarus, FPC: svn (Window32, Linux x64, Linux ARM (QNAP) (cross+nativ)
CPU-Target: X32 / X64 / ARMv5
Wohnort: Krefeld

Re: Erstellen eines Daemons und unix

Beitrag von mschnell »

Socke hat geschrieben:Direkt nach Programmstart führst du ein fork() durch. Den Elternprozess lässt du einfach terminieren. Der Kindprozess läuft dann als Daemon weiter. Der Systemcall fork() ist in der Funktion fpfork() in der Unit unix oder baseunix implementiert.
Das sollte man aber aber über einen Kommandozeilen-Parameter steuern, damit man das Programm auch zum Testen noch normal starten kann, so dass man seine Ausgaben direkt am Terminal sehen kann.

Das Programm ist mit fork aber noch genauso ein Kind des Terminal-Prozesses, mit dem es gestartet wurde, wie wenn man es mit "&" "im Hintergrund" startet. Ob es stimmt, dass es dann beendet wird, wenn der startende Prozess beendet wird, habe ich nicht getestet/recherchiert.

In jedem Fall muss man aber darauf achten, wohin die Input und Output Streams verbunden sind. Bash regelt das je nach "&", "|", "<" und ">". bei "fork()" musst man gegebenfalls eingreifen, wenn man stdin, stdout und stderr verwenden möchte.

-Michael

mschnell
Beiträge: 3444
Registriert: Mo 11. Sep 2006, 10:24
OS, Lazarus, FPC: svn (Window32, Linux x64, Linux ARM (QNAP) (cross+nativ)
CPU-Target: X32 / X64 / ARMv5
Wohnort: Krefeld

Re: Erstellen eines Daemons und unix

Beitrag von mschnell »

Socke hat geschrieben:. Damit kannst du dann Signale an deinen Daemon senden (dieser muss die entsprechenden Signal-Handler registrieren).
Er will anscheinend, dass der Daemon selber ge-restartet wird, wenn er aus irgendwelchen Gründen abstürtzt. Das geht am einfachsten mit initab, was genau dazu da ist. (Und dann braucht man auch kein fork(), da kann man ganz normale Programme verwenden. Ur-alte Linux-Methode.)

-Michael
Zuletzt geändert von mschnell am Di 18. Sep 2012, 10:23, insgesamt 1-mal geändert.

mschnell
Beiträge: 3444
Registriert: Mo 11. Sep 2006, 10:24
OS, Lazarus, FPC: svn (Window32, Linux x64, Linux ARM (QNAP) (cross+nativ)
CPU-Target: X32 / X64 / ARMv5
Wohnort: Krefeld

Re: Erstellen eines Daemons und unix

Beitrag von mschnell »

Scotty hat geschrieben:Das ist genauso falsch wie die anderen Aussagen.
Was genau ist falsch (bis darauf, dass der Begriff "richtiger Deamion" natürlich nicht eindeutig definiert ist) ?

Ich hatte die Frage nach einem "richtigen Deamon" so interpretiert, dass er
- automatisch wieder gestartet wird, wenn er abstützt
- auch auf einem System läuft, auf dem keine Grafik-System (wie X) gestartet wurde

-Michael

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

Re: Erstellen eines Daemons und unix

Beitrag von theo »

DD50 hat geschrieben:
Scotty hat geschrieben:Back to topic: Unter ../Lazarus/examples/cleandirs ist ein Beispiel für einen Daemon.
Das hatte ich schon gefunden. Aber dann muss ich wohl erstmal die allerneuste fpc version draufmachen. Ich habe die fpc_2.6.0-120824_i386 drauf.
Du musst das mitgelieferte Package lazdaemon installieren und die IDE neu bauen.
Danach hast du auch einen neuen Eintrage bei Projekt -> Neues Projekt -> Daemon (service) application.
Ausserdem müsste das example dann funzen.

DD50
Beiträge: 27
Registriert: Do 13. Sep 2012, 12:48

Re: Erstellen eines Daemons und unix

Beitrag von DD50 »

Also bei mir steht definitv das drinne.

Code: Alles auswählen

Program cleandirs;
 
Uses
{$IFDEF UNIX}{$IFDEF UseCThreads}
  cthreads,
{$ENDIF}{$ENDIF}
  {$IF FPC_FULLVERSION<20701}
  {$ERROR this example requires at least fpc 2.7.1}
  {$ENDIF}
  daemonapp,
  sysutils
  { add your units here }, svcmap, svccleandirs, dircleaner;
 
begin
  OnGetApplicationName:=@CleanDirApp;
  Application.Title:='Directory Cleaning service';
  Application.Initialize;
  Application.Run;
end.
So würde das unter c aussehen.

Code: Alles auswählen

int main(void)
{
  printf("Becoming a daemon...\n");
 
  // Dateihandles schliessen
  close(STDIN_FILENO);
  close(STDOUT_FILENO);
  close(STDERR_FILENO);
 
  // INT Signal ignorieren
  signal(SIGINT,SIG_IGN);
  signal(SIGUSR1,test);
 
  // Fork in den Background und exit() Vaterprozess
  if(fork() != 0)
    {
      exit(0);
    }
 
  // Change working directory
  chdir("/");
 
  // Vom tty los loesen
  setpgrp();
 
  // Mach was oder auch nichts...
  while(1){
	sleep (20);
	}
 
  return 0;
}
Da kann ich denn kill -SIGUSR1 machen, und dem programm etwas mitteilen. OHNE es zu beenden. Das ist nun nur ein kleines c beispiel. Und genau sowas wollte ich unter FreePascal/Lazarus machen.

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

Re: Erstellen eines Daemons und unix

Beitrag von theo »

Wenn's da steht, dann installiere halt die 2.7.1 (habe ich auch).

Hier gibt's auch noch infos:
http://www.turbog.com/wp-content/upload ... aemons.pdf" onclick="window.open(this.href);return false;

Daemonapp kapselt das alles für Multi-Platform, deshalb sieht es nicht aus wie bei C.
Du kannst sicher auch einen Linux spezifischen Code "zu Fuss" schreiben wie in C.

DD50
Beiträge: 27
Registriert: Do 13. Sep 2012, 12:48

Re: Erstellen eines Daemons und unix

Beitrag von DD50 »

theo hat geschrieben:Du kannst sicher auch einen Linux spezifischen Code "zu Fuss" schreiben wie in C.
Das werde ich wohl müssen. Ich dachte nur es gäb sowas als "missbrauchbares" example.

Antworten