Ich schreibe ein Shell-Skript , das ich beim Start als Daemon ausführen möchte, ohne externe Tools wie daemontools oder daemonize zu verwenden .
Linux Daemon Writing HOWTO
Laut Linux Daemon Writing HOWTO hat ein richtiger Daemon die folgenden Eigenschaften:
- Gabeln aus dem übergeordneten Prozess
- schließt alle Datei - Deskriptoren (dh
stdin
,stdout
,stderr
) - Öffnet Protokolle zum Schreiben (falls konfiguriert)
- ändert das Arbeitsverzeichnis in ein dauerhaftes (normalerweise
/
) - setzt den Dateimodus Maske (umask)
- Erstellt eine eindeutige Sitzungs-ID (SID)
Einführung dämonisieren
Die Einführung zu Daemonize geht noch weiter und besagt, dass ein typischer Daemon auch:
- Trennt sich von seinem Steuerterminal (falls vorhanden) und ignoriert alle Terminal-Signale
- trennt sich von seiner Prozessgruppe
- Griffe
SIGCLD
Wie würde ich in einem all dies tun sh
, dash
oder bash
Skript mit gängigen Linux - Tool nur?
Das Skript sollte in der Lage sein, auf so vielen Distributionen wie möglich ohne zusätzliche Software zu laufen, obwohl Debian unser Hauptaugenmerk ist.
ANMERKUNG: Ich weiß, dass es im StackExchange- Netzwerk viele Antworten gibt, die die Verwendung von nohup
oder empfehlen setsid
, aber keine dieser Methoden erfüllt alle oben genannten Anforderungen.
EDIT: Die Manpage daemon (7) gibt auch einige Hinweise, obwohl es einige Unterschiede zwischen älteren SysV
und neueren Daemons zu geben scheint systemd
. Da die Kompatibilität mit einer Vielzahl von Distributionen wichtig ist, stellen Sie bitte sicher, dass die Antwort alle Unterschiede deutlich macht.
quelle
daemon
und jene anderen Dinge dienen zum Ausführen von beliebigen Shell-Skripten, ohne dass das Ausführen als vorgesehen ist ein Daemon. Da Sie der Autor sind und die vollständige Kontrolle darüber haben, wie das Skript geschrieben wird, müssen Sie es so einrichten, dass es nur über ein systemd unitfile- oder rc.d-Skript gestartet werden kann. Du hast "Proper" angegeben!Antworten:
Mit systemd sollten Sie in der Lage sein, ein Skript als Dämon auszuführen, indem Sie eine einfache Einheit erstellen. Sie können viele verschiedene Optionen hinzufügen, dies ist jedoch so einfach wie möglich.
Angenommen, Sie haben ein Skript
/usr/bin/mydaemon
.Sie legen eine Einheit an
/etc/systemd/system/mydaemon.service
.Um den Dämon zu starten, rennst du
Um beim Booten zu starten, aktivieren Sie es
Wenn auf einem systemd - basiertes System, das eine Mehrheit der Linux - Distributionen heute ist, ist dies nicht wirklich ein externes Tool. Das Negative wäre, dass es nicht überall funktioniert.
quelle
systemd
ist es nicht mehr ein "externes Werkzeug" alsbash
.Mir fehlt hier wahrscheinlich etwas; warum genau wäre das nicht
nohup
angebracht? Natürlich ist es nicht genug für sich , aber es scheint einfach zu ergänzen.Soweit ich das beurteilen kann:
stdin
stirbt jedoch am Ende des übergeordneten Skriptsinit
(odersystemd
) repariert.Ich habe das starke Gefühl, das Offensichtliche zu verpassen. Downvote, aber bitte sag mir was es ist :-)
quelle
nohup
mit&
und I / O, um mehrere Nicht-C
Daemon-Dienstprogramme zu starten, möglicherweise mit der zusätzlichen Sicherheit, dass Ihrnohup
Befehl in a eingeschlossen wirdsu -c "nohup ... &" -s /bin/bash systemUser
, um den Daemon als nicht privilegierter Benutzer auszuführen.Der
screen
in den meisten Distributionen enthaltene Linux- Befehl kann ein Shell-Skript dämonisieren. Ich benutze es oft. Hier ist ein kurzes Beispiel zum Starten, Auflisten und Beenden einer getrennten Bildschirmsitzung ...quelle
screen
deamonisiert kein Shell-Skript. Es läuft nur in einem bestimmten Terminal und kann sich von diesem Terminal lösen (wie Tastatur vom PC abziehen), ohne die Sitzung zu beenden. Das Programm, das auf dem getrennten Terminal ausgeführt wird, wird also im Hintergrund ausgeführt. Deshalb - Passprogramm im Hintergrund trennen.