Ich habe ein Skript, das mein PHP -Skript jedes X-mal ausführt:
#!/bin/bash
while true; do
/usr/bin/php -f ./my-script.php
echo "Waiting..."
sleep 3
done
Wie kann ich es als Daemon starten?
Um es als vollständigen Daemon von einer Shell aus auszuführen, müssen Sie setsid
verwenden und die Ausgabe umleiten. Sie können die Ausgabe in eine Protokolldatei oder an /dev/null
umleiten, um sie zu löschen. Angenommen, Ihr Skript heißt myscript.sh. Verwenden Sie den folgenden Befehl:
setsid myscript.sh >/dev/null 2>&1 < /dev/null &
Dadurch wird der Prozess vollständig von Ihrer aktuellen Shell (stdin, stdout und stderr) getrennt. Wenn Sie die Ausgabe in einer Protokolldatei behalten möchten, ersetzen Sie den ersten /dev/null
durch Ihre/path/to/logfile.
Sie müssen die Ausgabe umleiten, andernfalls wird sie nicht als echter Daemon ausgeführt (dies hängt von Ihrer Shell ab, um die Ausgabe zu lesen und zu schreiben).
Ein Daemon ist nur ein Programm, das als Hintergrundprozess ausgeführt wird und nicht direkt von einem interaktiven Benutzer gesteuert wird.
[Der folgende bash-Code ist für Debian-Systeme - Ubuntu, Linux Mint-Distributionen usw.]
Der einfache Weg:
Die einfache Möglichkeit wäre, Ihre /etc/rc.local -Datei zu bearbeiten und dann Ihr Skript von dort aus laufen zu lassen (d. H. Jedes Mal, wenn Sie das System hochfahren)
Sudo nano /etc/rc.local
Fügen Sie Folgendes hinzu und speichern Sie:
#For a BASH script
/bin/sh TheNameOfYourScript.sh > /dev/null &
Der beste Weg wäre, einen Daemon über Upstart zu erstellen:
Sudo nano /etc/init/TheNameOfYourDaemon.conf
folgendes hinzufügen:
description "My Daemon Job"
author "Your Name"
start on runlevel [2345]
pre-start script
echo "[`date`] My Daemon Starting" >> /var/log/TheNameOfYourDaemonJobLog.log
end script
exec /bin/sh TheNameOfYourScript.sh > /dev/null &
Speichere das.
Bestätigen Sie, dass es in Ordnung ist:
init-checkconf /etc/init/TheNameOfYourDaemon.conf
Starten Sie jetzt die Maschine neu:
Sudo reboot
Wenn Sie jetzt Ihr System starten, können Sie die Protokolldatei sehen, die besagt, dass Ihr Daemon läuft:
cat /var/log/TheNameOfYourDaemonJobLog.log
• Jetzt können Sie starten/stoppen/neu starten/den Status Ihres Daemons abrufen:
restart: dies stoppt und startet dann einen Dienst
Sudo service TheNameOfYourDaemonrestart restart
start: Damit wird ein Dienst gestartet, wenn er nicht ausgeführt wird.
Sudo service TheNameOfYourDaemonstart start
stop: ein Dienst wird angehalten, wenn er ausgeführt wird
Sudo service TheNameOfYourDaemonstop stop
status: zeigt den Status eines Dienstes an
Sudo service TheNameOfYourDaemonstatus status
Sie können nach /etc/init.d/ wechseln - Sie sehen eine Daemon-Vorlage namens Skeleton.
Sie können es duplizieren und dann Ihr Skript unter der Startfunktion eingeben.
Ein weiterer cooler Trick besteht darin, Funktionen oder Subshells im Hintergrund auszuführen, die jedoch nicht immer machbar sind
name(){
echo "Do something"
sleep 1
}
# put a function in the background
name &
#Example taken from here
#https://bash.cyberciti.biz/guide/Putting_functions_in_background
Subshell im Hintergrund ausführen
(echo "started"; sleep 15; echo "stopped") &
Einige Kommentatoren haben bereits erklärt, dass Antworten auf Ihre Frage nicht für alle Distributionen funktionieren. Da Sie CentOS nicht in die Frage, sondern nur in die Tags aufgenommen haben, möchte ich hier die Themen posten, die Sie verstehen müssen, um unabhängig von der Verteilung die Kontrolle über sein Vorgehen zu haben:
Um Ihr Problem zu lösen, können Sie das Skript auf sysinit starten, indem Sie diese Zeile in/etc/inittab hinzufügen und es für den Fall eines Abbruchs veranlassen, falls es beendet wird:
# start and respawn after termination
ttyS0::respawn:/bin/sh /path/to/my_script.sh
Das Skript muss natürlich vorab ausführbar gemacht werden:
chmod +x /path/to/my_script.sh
Hoffe das hilft