2016-05-25 5 views
1

Ich habe ein Bash-Skript, das dämonisieren sollte selbst nach dem Ausführen. Meine Lösung sieht wie folgt aus:Bash: Daemonisierung durch Forking-Prozess als ein neues Kind

#!/bin/sh -xe 
child() { 
    echo child 
} 
child & # fork child 
echo parent 
kill $$ # kill parent 

jedoch selbst das gesamte Skript setzt innerhalb der Funktion child nicht die richtige Sache zu tun scheinen. Leider wird exec & nicht den gesamten Prozess in ein Hintergrund-Kind abzweigen.

Wie erreicht man den gewünschten Effekt?

Antwort

2

Normalerweise mache ich so etwas wie dieses:

#!/bin/bash 

if [ -z "$_IS_DAEMON" ]; then 
    _IS_DAEMON=1 /bin/bash $0 "[email protected]" & 
    exit 
fi 

echo "I'm a deamon!" 

Das Skript startet sich neu effektiv im Hintergrund, während die vom Benutzer gestartet Skript zu verlassen.

Um die Daemonisierung Status zu erkennen, verwendet es eine Umgebungsvariable (die $_IS_DAEMON in dem obigen Beispiel): wenn nicht festgelegt, angenommen, von Benutzer gestartet werden; Wenn gesetzt, wird davon ausgegangen, dass es als Teil der Daemonisierung gestartet wurde.

selbst neu zu starten, ruft das Skript einfach $0 "[email protected]": die $0 der Name des Skripts, wie vom Benutzer gestartet wurde, und die "[email protected]" ist die Argumente an das Skript übergeben, erhalten mit weißen Räumen und alle (im Gegensatz zu den $*). Ich nenne die benötigte Shell auch explizit, um Verwechslungen zwischen /bin/bash und /bin/sh zu vermeiden, die auf den meisten * nix-Systemen nicht identisch sind.

+0

@Inische, erweiterte Antwort. – Dummy00001

+0

Das erklärt es! Gute Antwort! – Inian

+1

Beachten Sie, dass, obwohl ich '/ bin/bash' explizit spezifiziere, der Trick auch mit anderen Shells funktionieren würde. Das einzige Problem ist mit den Shells, die "$ @" (oder Alternativen) nicht unterstützen, um die Argumente wörtlich an die Subshell zu übergeben. Aber außerhalb einiger kommerzieller * nix-Systeme mit sehr altem '/ bin/sh' sollten Sie keine Probleme haben. – Dummy00001

Verwandte Themen