Exécuter le script bash en tant que démon
J'ai un script, qui exécute mon script PHP chaque fois X:
#!/bin/bash
while true; do
/usr/bin/php -f ./my-script.php
echo "Waiting..."
sleep 3
done
Comment puis-je le démarrer en tant que démon?
4 réponses
Pour l'exécuter en tant que démon complet à partir d'un shell, vous devrez utiliser setsid
et rediriger sa sortie. Vous pouvez rediriger la sortie vers un fichier journal ou vers /dev/null
pour la supprimer. En supposant que votre script est appelé myscript.sh, utilisez la commande suivante:
setsid myscript.sh >/dev/null 2>&1 < /dev/null &
Cela va complètement détacher le processus de votre shell actuel (stdin, stdout et stderr). Si vous voulez conserver la sortie dans un fichier journal, remplacez le premier /dev/null
par votre / path / to / logfile.
, Vous devez rediriger la sortie, sinon il ne fonctionnera pas comme un vrai démon (cela dépendra de votre shell pour lire et écrire la sortie).
Un démon est juste un programme qui fonctionne comme un processus d'arrière-plan, plutôt que d'être sous le contrôle direct d'un utilisateur interactif...
[le code bash ci-dessous est pour les systèmes Debian-Ubuntu, Linux Mint distributions et ainsi de suite]
Le moyen simple:
Le moyen le plus simple serait de modifier votre fichier /etc/rc.fichier local, puis faites exécuter votre script à partir de là (c'est-à-dire chaque fois que vous démarrez le système):
sudo nano /etc/rc.local
Ajouter ce qui suit et enregistrer:
#For a BASH script
/bin/sh TheNameOfYourScript.sh > /dev/null &
La meilleure façon de le faire serait de créer un Démon par le biais de Upstart:
sudo nano /etc/init/TheNameOfYourDaemon.conf
Ajouter ce qui suit:
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 &
Enregistrez ceci.
Confirmez qu'il semble ok:
init-checkconf /etc/init/TheNameOfYourDaemon.conf
Redémarrez maintenant la machine:
sudo reboot
Maintenant, lorsque vous démarrez votre système, vous pouvez voir le fichier journal indiquant que votre Démon est en cours d'exécution:
cat /var/log/TheNameOfYourDaemonJobLog.log
• Maintenant, vous pouvez démarrer/arrêter/redémarrer/obtenir le statut de votre Démon via:
redémarrer: cette va s'arrêter, puis démarrer un service
sudo service TheNameOfYourDaemonrestart restart
démarrer: cela va démarrer un service, s'il n'est pas en cours d'exécution
sudo service TheNameOfYourDaemonstart start
stop: cela arrêtera un service, s'il est en cours d'exécution
sudo service TheNameOfYourDaemonstop stop
statut: cela permet d'afficher le statut d'un service
sudo service TheNameOfYourDaemonstatus status
Vous pouvez aller dans /etc / init.d / - vous verrez un modèle de démon appelé squelette.
Vous pouvez le dupliquer, puis entrer votre script sous la fonction démarrer.
Une autre astuce intéressante consiste à exécuter des fonctions ou des sous-shell en arrière-plan, ce qui n'est pas toujours possible
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
Exécution d'un sous-shell en arrière-plan
(echo "started"; sleep 15; echo "stopped") &