Je bricole Docker pour différents services et j'ai souvent besoin de démarrer plusieurs processus lors du "boot" du container et qu'ils restent actif par la suite.
Nouvelle version du script encore plus simple
#!/bin/bash # $1 nom du processus a chercher via ps # $2 nom du service a demarrer start () { ps aux | grep $1 | grep -q -v grep if [ $? -ne 0 ]; then service $2 restart fi } start "ssh" "ssh" start "apache2" "apache2" start "mysql" "mysql" while sleep 60; do start "ssh" "ssh" start "apache2" "apache2" start "mysql" "mysql" done
Du coups je me suis fais un petit script de base, il est pas forcément des plus propres mais en tout cas il marche pas trop mal.
#!/bin/bash start () { if [ $2 -ne 0 ]; then # Necessaire pour les processus n'ayant # pas le meme nom que le service $1 kill -15 $2 else ps aux | grep $1 | grep -q -v grep if [ $? -ne 0 ]; then service $1 restart fi fi } start "ssh" "0" start "cron" "0" start "apache2" "0" start "mysql" "0" start "php7.1-fpm" "0" PID_DIR="/var/run/elasticsearch" PID_NAME=elasticsearch PID_NUMBER=`cat $PID_DIR/$PID_NAME.pid` start "elasticsearch" $PID_NUMBER while sleep 60; do start "ssh" "0" start "cron" "0" start "apache2" "0" start "mysql" "0" start "php7.1-fpm" "0" PID_DIR="/var/run/elasticsearch" PID_NAME=elasticsearch PID_NUMBER=`cat $PID_DIR/$PID_NAME.pid` start "elasticsearch" $PID_NUMBER done
La fonction start() s'occupe de contrôler l'existance d'un processus $1 ou $2. Suivant le cas elle le tue (si $2 est renseigné) et elle le lance si il n'existe pas.
start "ssh" "0" start "cron" "0" start "apache2" "0" start "mysql" "0" start "php7.1-fpm" "0" PID_DIR="/var/run/elasticsearch" PID_NAME=elasticsearch PID_NUMBER=`cat $PID_DIR/$PID_NAME.pid` start "elasticsearch" $PID_NUMBER
Appel de la fonction avec le service à démarrer. Le service doit porter le même nom ou contenir le nom pour à la fois servir au grep et à la commande service. Par exemple pour ssh, le nom du processus est sshd mais pour le lancer c'est la commande
service ssh restart
Par chance ils ont un point commun dans leurs nom : ssh. Dans le cas d'un nom de processus différent de celui du service il va falloir passer par le pid. C'est ce que je fais pour elasticsearch
Ensuite il faut maintenir tout ce petit monde en fonction, C'est cette boucle qui se lance toute les 60 secondes qui en a la charge.
while sleep 60; do start "ssh" "0" start "cron" "0" start "apache2" "0" start "mysql" "0" start "php7.1-fpm" "0" PID_DIR="/var/run/elasticsearch" PID_NAME=elasticsearch PID_NUMBER=`cat $PID_DIR/$PID_NAME.pid` start "elasticsearch" $PID_NUMBER done
C'est pas forcément le plus propre et d'ailleurs si vous avez mieux je prends.