J'ai un script qui exécute mon script PHP toutes les X fois:
#!/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?
Pour l'exécuter en tant que démon complet à partir d'un shell, vous devez utiliser setsid
et rediriger sa sortie. Vous pouvez rediriger la sortie vers un fichier journal ou vers /dev/null
pour le supprimer. En supposant que votre script s'appelle myscript.sh, utilisez la commande suivante:
setsid myscript.sh >/dev/null 2>&1 < /dev/null &
Cela détachera complètement le processus de votre Shell actuel (stdin, stdout et stderr). Si vous souhaitez 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 s’exécutera pas comme un véritable démon (la lecture et l’écriture de la sortie dépendent de votre shell).
Un démon est juste un programme qui s'exécute en tant que processus en arrière-plan, plutôt que sous le contrôle direct d'un utilisateur interactif ...
[Le code bash ci-dessous est pour les systèmes Debian - Ubuntu, les distributions Linux Mint et ainsi de suite]
La manière simple:
Le moyen le plus simple serait d’éditer votre fichier /etc/rc.local, puis d’exécuter votre script à partir de là (c’est-à-dire chaque fois que vous démarrez le système):
Sudo nano /etc/rc.local
Ajoutez les éléments suivants et enregistrez:
#For a BASH script
/bin/sh TheNameOfYourScript.sh > /dev/null &
La meilleure façon de faire serait de créer un démon via Upstart:
Sudo nano /etc/init/TheNameOfYourDaemon.conf
ajoutez 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 &
Sauvegarde ça.
Confirmez que ça a l'air correct:
init-checkconf /etc/init/TheNameOfYourDaemon.conf
Maintenant, redémarrez 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
• Vous pouvez maintenant démarrer/arrêter/redémarrer/obtenir le statut de votre démon via:
restart: cela va arrêter, puis démarrer un service
Sudo service TheNameOfYourDaemonrestart restart
start: cela démarrera 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
status: ceci affichera le statut d'un service
Sudo service TheNameOfYourDaemonstatus status
Vous pouvez aller à /etc/init.d/ - vous verrez un modèle de démon appelé squelette.
Vous pouvez le dupliquer, puis entrez votre script sous la fonction de démarrage.
Une autre astuce consiste à exécuter des fonctions ou des sous-shell en arrière-plan, ce qui n'est pas toujours faisable
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") &
Certains commentateurs ont déjà indiqué que les réponses à votre question ne fonctionneraient pas pour toutes les distributions. Puisque vous n'avez pas inclus CentOS dans la question, mais uniquement dans les balises, j'aimerais publier ici les sujets qu'il faut comprendre pour pouvoir contrôler sa procédure, quelle que soit la distribution:
Pour votre problème, vous pouvez démarrer le script sur sysinit en ajoutant cette ligne dans/etc/inittab et en le faisant respawn au cas où il se terminerait:
# start and respawn after termination
ttyS0::respawn:/bin/sh /path/to/my_script.sh
Le script doit être rendu exécutable à l’avance:
chmod +x /path/to/my_script.sh
J'espère que cela t'aides