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?

47
demandé sur Eric Leschinski 2013-10-07 23:57:14

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

105
répondu micromoses 2013-10-07 21:37:29

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
26
répondu CMP 2016-05-14 13:52:50

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.

14
répondu Refael 2014-10-27 19:37:46

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") &
1
répondu Luis Muñoz 2016-04-01 19:03:28