Ich frage mich, ob es einen besseren Weg gibt, einen Daemon zu erstellen, der nur mit sh auf etwas wartet, als:
#! /bin/sh
trap processUserSig SIGUSR1
processUserSig() {
echo "doing stuff"
}
while true; do
sleep 1000
done
Insbesondere frage ich mich, ob es eine Möglichkeit gibt, die Schleife loszuwerden und das Ding trotzdem auf die Signale warten zu lassen.
Antworten:
Verwenden Sie die Daemon-Funktion Ihres Systems, z. B. Start-Stopp-Daemon .
Ansonsten muss es ja irgendwo eine Schleife geben.
quelle
Nur ein Hintergrundbild Ihres Skripts (
./myscript &
) wird es nicht dämonisieren. Siehe http://www.faqs.org/faqs/unix-faq/programmer/faq/ , Abschnitt 1.7, in dem beschrieben wird, was erforderlich ist, um ein Daemon zu werden. Sie müssen es vom Terminal trennen, damitSIGHUP
es nicht zerstört wird. Sie können eine Verknüpfung verwenden, um ein Skript wie einen Dämon erscheinen zu lassen.wird den Job machen. Oder um sowohl stderr als auch stdout in einer Datei zu erfassen:
Es kann jedoch weitere wichtige Aspekte geben, die Sie berücksichtigen müssen. Beispielsweise:
chdir("/")
(odercd /
in Ihrem Skript) und fork, damit das übergeordnete Element beendet wird und somit der ursprüngliche Deskriptor geschlossen wird.umask 0
. Möglicherweise möchten Sie nicht von der Umask des Aufrufers des Dämons abhängig sein.Ein Beispiel für ein Skript , das alle diese Aspekte berücksichtigt, finden Sie Mike S‘Antwort .
quelle
0<&-
das Es ist nicht offensichtlich, was diese Zeichenfolge bewirkt.0<&-
zu tun ist. Ich habe diesen Link gefunden, der es erklärt.0<&-
schließt stdin (fd 0). Auf diese Weise wird ein Fehler angezeigt, wenn Ihr Prozess versehentlich von stdin liest (einfach durchzuführen), anstatt ewig darauf zu warten, dass Daten angezeigt werden.In einigen der oben aufgeführten Antworten fehlen einige wichtige Teile dessen, was einen Daemon zu einem Daemon macht, im Gegensatz zu nur einem Hintergrundprozess oder einem von einer Shell getrennten Hintergrundprozess.
Diese http://www.faqs.org/faqs/unix-faq/programmer/faq/ beschreibt, was notwendig ist, um ein Daemon zu sein. Und dieses Run-Bash-Skript als Daemon implementiert die Setsid, obwohl das chdir zum Rooten fehlt.
Die Frage des Originalplakats war tatsächlich spezifischer als "Wie erstelle ich einen Daemon-Prozess mit Bash?", Aber da das Thema und die Antworten die Dämonisierung von Shell-Skripten im Allgemeinen behandeln, halte ich es für wichtig, darauf hinzuweisen (für Eindringlinge wie mich, die sich mit dem beschäftigen feine Details zum Erstellen eines Daemons).
Hier ist meine Wiedergabe eines Shell-Skripts, das sich gemäß den häufig gestellten Fragen verhält. Stellen Sie DEBUG auf ein
true
, um eine hübsche Ausgabe zu sehen (aber es wird auch sofort beendet, anstatt sich endlos zu wiederholen):Die Ausgabe sieht so aus, wenn sie auf eingestellt
DEBUG
isttrue
. Beachten Sie, wie sich die Sitzungs- und Prozessgruppen-ID-Nummern (SESS, PGID) ändern:quelle
fork()' so the parent can exit, this returns control to the command line or shell invoking your program. ... 2.
setsid () ', um eine Prozessgruppe und ein Sitzungsgruppenleiter zu werden ... unser Prozess hat jetzt kein steuerndes Terminal eine gute Sache für Dämonen ... 3. `fork () 'wieder, damit die Eltern ... beenden können. Dies bedeutet, dass wir als Gruppenleiter außerhalb der Sitzung niemals ein kontrollierendes Terminal wiedererlangen können."quelle
stdin
,stdout
,stderr
. Zumindest nicht mitsh
.Es hängt wirklich davon ab, was die Binärdatei selbst tun wird.
Zum Beispiel möchte ich einen Listener erstellen.
Der Start-Daemon ist eine einfache Aufgabe:
lis_deamon:
So starten wir den Daemon (gemeinsame Methode für alle /etc/init.d/ Mitarbeiter)
Was nun den Hörer selbst betrifft, muss es eine Art Schleife / Alarm sein, sonst wird das Skript ausgelöst, um das zu tun, was Sie wollen. Wenn Sie beispielsweise möchten, dass Ihr Skript 10 Minuten lang schläft und aufwacht und Sie fragt, wie es Ihnen geht, tun Sie dies mit dem
Hier ist der einfache Listener, den Sie ausführen können, der auf Ihre Befehle vom Remote-Computer wartet und diese lokal ausführt:
Zuhörer:
So starten Sie UP: / tmp / deamon_test / listener start
und um Befehle von der Shell zu senden (oder sie in ein Skript zu verpacken):
Hoffe das wird helfen.
quelle
$ ( cd /; umask 0; setsid your_script.sh </dev/null &>/dev/null & ) &
quelle
Schauen Sie sich das Daemon-Tool aus dem libslack-Paket an:
http://ingvar.blog.linpro.no/2009/05/18/todays-sysadmin-tip-using-libslack-daemon-to-daemonize-a-script/
Verwenden Sie unter Mac OS X ein Launchd-Skript für den Shell-Daemon.
quelle
Wenn ich ein hatte
script.sh
und es von Bash ausführen und laufen lassen wollte, auch wenn ich meine Bash-Sitzung schließen möchte, würde ich es kombinierennohup
und&
am Ende.Beispiel:
nohup ./script.sh < inputFile.txt > ./logFile 2>&1 &
inputFile.txt
kann eine beliebige Datei sein. Wenn Ihre Datei keine Eingabe hat, verwenden wir normalerweise/dev/null
. Der Befehl wäre also:nohup ./script.sh < /dev/null > ./logFile 2>&1 &
Schließen Sie danach Ihre Bash-Sitzung, öffnen Sie ein anderes Terminal und führen
ps -aux | egrep "script.sh"
Sie Folgendes aus: und Sie werden sehen, dass Ihr Skript noch im Hintergrund ausgeführt wird. Wenn Sie es stoppen möchten, führen Sie natürlich den gleichen Befehl (ps) und auskill -9 <PID-OF-YOUR-SCRIPT>
quelle
Siehe Bash Service Manager- Projekt: https://github.com/reduardo7/bash-service-manager
Implementierungsbeispiel
Anwendungsbeispiel
quelle
Wie viele Antworten ist diese keine "echte" Dämonisierung, sondern eine Alternative zum
nohup
Ansatz.Es gibt offensichtlich Unterschiede zur Verwendung
nohup
. Zum einen gibt es überhaupt keine Trennung vom Elternteil. Außerdem erbt "script.sh" nicht die Umgebung der Eltern.Dies ist keineswegs eine bessere Alternative. Es ist einfach eine andere (und etwas faule) Art, Prozesse im Hintergrund zu starten.
PS Ich persönlich habe Carlos Antwort positiv bewertet, da sie die eleganteste zu sein scheint und sowohl über Terminal- als auch über Inside-Skripte funktioniert
quelle
Versuchen Sie es mit &, wenn Sie diese Datei als program.sh speichern
Sie können verwenden
quelle