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

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.DD50 hat geschrieben:ich versuche einen Daemon unter unix zu machen.
Die beiden Aspekte (self-daemonizing statt "&" und Restart haben nichts mit einander zu tun.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.
Das ist genauso falsch wie die anderen Aussagen.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 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.Scotty hat geschrieben:Back to topic: Unter ../Lazarus/examples/cleandirs ist ein Beispiel für einen Daemon.
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:Mit & starte ich es im moment. Ich finde das allerding nicht so "sauber".
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:Ein "richtiger" daemon kann ja (wenn man es ihm beibringt) auch einen restart usw.
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).DD50 hat geschrieben: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.Scotty hat geschrieben:Back to topic: Unter ../Lazarus/examples/cleandirs ist ein Beispiel für einen Daemon.
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.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.
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.)Socke hat geschrieben:. Damit kannst du dann Signale an deinen Daemon senden (dieser muss die entsprechenden Signal-Handler registrieren).
Was genau ist falsch (bis darauf, dass der Begriff "richtiger Deamion" natürlich nicht eindeutig definiert ist) ?Scotty hat geschrieben:Das ist genauso falsch wie die anderen Aussagen.
Du musst das mitgelieferte Package lazdaemon installieren und die IDE neu bauen.DD50 hat geschrieben: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.Scotty hat geschrieben:Back to topic: Unter ../Lazarus/examples/cleandirs ist ein Beispiel für einen Daemon.
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.
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;
}
Das werde ich wohl müssen. Ich dachte nur es gäb sowas als "missbrauchbares" example.theo hat geschrieben:Du kannst sicher auch einen Linux spezifischen Code "zu Fuss" schreiben wie in C.