web-dev-qa-db-fra.com

Exécuter le script bash en tant que démon

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?

49
Sergey B.

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

111
micromoses

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

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.

14
Refael

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

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:

  1. qu'est-ce que le démon init (optionnel)
  2. qu'est-ce que le fichier inittab (/ etc/inittab) 
  3. que fait le fichier inittab dans votre distribution (par exemple, exécute-t-il tous les scripts dans /etc/init.d?)

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

0
Niko