it-swarm.com.de

Führen Sie das Bash-Skript als Daemon aus

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?

49
Sergey B.

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).

111
micromoses

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
31
CMP

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.

14
Refael

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") &
1
Luis Muñoz

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:

  1. was ist der init-daemon (optional)
  2. was ist die Inittab-Datei (/ etc/inittab) 
  3. was bewirkt die inittab-Datei in Ihrer Distribution?

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

0
Niko