Unter Linux möchte ich einen Daemon hinzufügen, der nicht gestoppt werden kann und der Änderungen am Dateisystem überwacht. Wenn Änderungen festgestellt werden, sollte der Pfad zu der Konsole, auf der er gestartet wurde, sowie ein Zeilenumbruch geschrieben werden.
Ich habe bereits den Code zum Ändern des Dateisystems fast fertig, kann aber nicht herausfinden, wie ein Daemon erstellt wird.
Mein Code stammt von hier: http://www.yolinux.com/TUTORIALS/ForkExecProcesses.html
Was tun nach der Gabelung?
int main (int argc, char **argv) {
pid_t pID = fork();
if (pID == 0) { // child
// Code only executed by child process
sIdentifier = "Child Process: ";
}
else if (pID < 0) {
cerr << "Failed to fork" << endl;
exit(1);
// Throw exception
}
else // parent
{
// Code only executed by parent process
sIdentifier = "Parent Process:";
}
return 0;
}
inotify
API interessiert . Sehen:inotify_init
,inotify_add_watch
,inotify_rm_watch
.Antworten:
Daemons arbeiten im Hintergrund und gehören (normalerweise ...) nicht zu einem TTY. Deshalb können Sie stdout / stderr nicht so verwenden, wie Sie es wahrscheinlich möchten. Normalerweise ein Syslog-Daemon ( syslogd ) zum Protokollieren von Nachrichten in Dateien verwendet (Debug, Fehler, ...).
Daneben sind einige Schritte erforderlich um einen Prozess zu dämonisieren.
Wenn ich mich richtig erinnere, sind diese Schritte:
Um Ihnen einen Ausgangspunkt zu geben: Sehen Sie sich diesen Skelettcode an, der die grundlegenden Schritte zeigt. Dieser Code kann jetzt auch auf GitHub: Basic-Skelett eines Linux-Daemons gegabelt werden
gcc -o firstdaemon daemonize.c
./firstdaemon
Überprüfen Sie, ob alles richtig funktioniert:
ps -xj | grep firstdaemon
Die Ausgabe sollte dieser ähnlich sein:
Was Sie hier sehen sollten, ist:
(wegen der zweiten Gabelung ())
Lesen des Syslogs:
/var/log/syslog
Machen Sie eine:
grep firstdaemon /var/log/syslog
Die Ausgabe sollte dieser ähnlich sein:
Ein Hinweis: In der Realität möchten Sie auch einen Signalhandler implementieren und die Protokollierung ordnungsgemäß einrichten (Dateien, Protokollierungsstufen ...).
Weiterführende Literatur:
quelle
fork()
Warum nicht einfach anstelle des zweiten verwendensetsid()
?sigaction()
Funktion einen umfassenderen und zuverlässigeren Mechanismus zur Steuerung von Signalen bietet. neue Anwendungen solltensigaction()
eher als verwendensignal()
.man 7 daemon
beschreibt detailliert, wie ein Daemon erstellt wird. Meine Antwort ist nur ein Auszug aus diesem Handbuch.Es gibt mindestens zwei Arten von Dämonen:
SysV Daemons
Wenn Sie an einem herkömmlichen SysV- Daemon interessiert sind , sollten Sie die folgenden Schritte ausführen :
Beachten Sie diese Warnung:
Beachten Sie, dass dies
daemon()
nicht POSIX- kompatibel ist.Daemons im neuen Stil
Für Dämonen neuen Stils werden die folgenden Schritte empfohlen:
Um mehr zu erfahren, lesen Sie das Ganze
man 7 daemon
.quelle
Sie können unter Linux keinen Prozess erstellen, der nicht beendet werden kann. Der Root-Benutzer (uid = 0) kann ein Signal an einen Prozess senden, und es gibt zwei Signale, die nicht abgefangen werden können: SIGKILL = 9, SIGSTOP = 19. Andere Signale (wenn sie nicht erfasst werden) können ebenfalls zur Beendigung des Prozesses führen.
Möglicherweise möchten Sie eine allgemeinere Daemonisierungsfunktion, in der Sie einen Namen für Ihr Programm / Ihren Daemon und einen Pfad zum Ausführen Ihres Programms angeben können (möglicherweise "/" oder "/ tmp"). Möglicherweise möchten Sie auch Dateien für stderr und stdout (und möglicherweise einen Steuerpfad mit stdin) bereitstellen.
Hier sind die notwendigen Includes:
Und hier ist eine allgemeinere Funktion,
Hier ist ein Beispielprogramm, das zu einem Daemon wird, herumhängt und dann geht.
Beachten Sie, dass SIG_IGN anzeigt, dass das Signal abgefangen und ignoriert werden soll. Sie können einen Signalhandler erstellen, der den Signalempfang protokollieren und Flags setzen kann (z. B. ein Flag, das ein ordnungsgemäßes Herunterfahren anzeigt).
quelle
Versuchen Sie es mit der
daemon
Funktion:Von der Manpage :
quelle
daemon(7)
Handbuch Schritte zum Erstellen eines Dämons erwähnt werden und Folgendes gewarnt wird: Die BSD-daemon()
Funktion sollte nicht verwendet werden, da sie nur eine Teilmenge dieser Schritte implementiert.daemon
Die Funktion wurde erstmals in 4.4BSD angezeigt und ist nicht POSIX-kompatibel .Ich kann bei der ersten Anforderung "Ein Daemon, der nicht gestoppt werden kann ..." anhalten.
Nicht möglich, mein Freund; Sie können dies jedoch auch mit einem viel besseren Tool, einem Kernelmodul, erreichen.
http://www.infoq.com/articles/inotify-linux-file-system-event-monitoring
Alle Dämonen können gestoppt werden. Einige sind leichter zu stoppen als andere. Sogar ein Daemon-Paar mit dem Partner in der Warteschleife, das den Partner bei Verlust wieder erscheinen lässt, kann gestoppt werden. Man muss nur etwas härter daran arbeiten.
quelle
Wenn Ihre App eine der folgenden ist:
und Sie haben nichts gegen eine NodeJS-Abhängigkeit, dann installieren Sie NodeJS und dann:
So lassen Sie alle Apps beim Neustart laufen (und pm2 daemonisieren):
Jetzt kannst du:
(Außerdem können Sie problemlos nach Codeänderungen in Ihrem App-Verzeichnis suchen und den App-Prozess automatisch neu starten, wenn eine Codeänderung auftritt.)
quelle
Durch Aufrufen von fork () haben Sie einen untergeordneten Prozess erstellt. Wenn der Fork erfolgreich ist (Fork hat eine PID ungleich Null zurückgegeben), wird die Ausführung ab diesem Punkt innerhalb des untergeordneten Prozesses fortgesetzt. In diesem Fall möchten wir den übergeordneten Prozess ordnungsgemäß beenden und dann unsere Arbeit im untergeordneten Prozess fortsetzen.
Vielleicht hilft das: http://www.netzmafia.de/skripten/unix/linux-daemon-howto.html
quelle
Ein Daemon ist nur ein Prozess im Hintergrund. Wenn Sie Ihr Programm beim Booten des Betriebssystems unter Linux starten möchten, fügen Sie Ihren Startbefehl zu /etc/rc.d/rc.local (nach allen anderen Skripten ausführen) oder /etc/startup.sh hinzu
Unter Windows erstellen Sie einen Dienst, registrieren den Dienst und stellen ihn so ein, dass er beim Booten im Bereich Verwaltung -> Dienste automatisch gestartet wird.
quelle
Daemon-Vorlage
Ich habe eine Daemon-Vorlage geschrieben, die dem neuen Daemon folgt: link
Den gesamten Vorlagencode finden Sie auf GitHub: hier
Main.cpp
Daemon.hpp
Daemon.cpp
daemon-template.service
quelle