Utilisation des named pipes sous linux
Dans un script bash, il est difficile de lancer des opérations en parallèle, tout en gardant le contrôle. Si on lance plusieurs commandes en tâche de fond (avec le caractère &) les scripts s'exécutent, mais on ne peut pas s'assurer qu'ils se terminent avant de finir le traitement.
Cependant, une notion nous permet de synchroniser des opérations : les named pipes. C'est une méthode de communication inter-process, qui peut donc être utilisée pour synchroniser des actions. Nous allons démontrer ceci avec un exemple simple. Un script "lanceur" qui lance deux autres scripts en tâche de fond, et attend que les deux scripts soient terminés avant de reprendre la main.
Script principal
Script launcher, qui lance les scripts 1 et 2 en parallèle.
Ce script va créér le named pipe avec la commande mkfifo
launcher.sh
#!/bin/bash # # launcher.sh # function trace { echo $(date '+%Y-%m-%d %H:%M:%S') "-" $* } OUTPUT="/tmp/.test" mkfifo $OUTPUT &> /dev/null trace "Lancement script 1" ./script1.sh > $OUTPUT & trace "Lancement script 2" ./script2.sh > $OUTPUT & trace "Contenu du named pipe" cat $OUTPUT trace "Arret du launcher"
Script 1
script1.sh
#!/bin/bash # # script1.sh # function trace { echo $(date '+%Y-%m-%d %H:%M:%S') "-" $* } trace "Script 1 - step 1" sleep 10 trace "Script 1 - step 2" sleep 4 trace "Script 1 - End"
Script 2
script1.sh
#!/bin/bash # # script2.sh # function trace { echo $(date '+%Y-%m-%d %H:%M:%S') "-" $* } trace "Script 2 - step 1" sleep 8 trace "Script 2 - step 2" sleep 12 trace "Script 2 - End"
Résultats
Lorsqu'on lance le script launcher.sh
, on a le résultat suivant :
./launcher.sh 2013-10-25 16:55:16 - Lancement script 1 2013-10-25 16:55:16 - Lancement script 2 2013-10-25 16:55:16 - Attente de la fin des scripts 1 et 2 2013-10-25 16:55:16 - Reste du traitement dans le launcher 2013-10-25 16:55:16 - Contenu du pipe : 2013-10-25 16:55:16 - Script 1 - step 1 2013-10-25 16:55:16 - Script 2 - step 1 2013-10-25 16:55:24 - Script 2 - step 2 2013-10-25 16:55:26 - Script 1 - step 2 2013-10-25 16:55:30 - Script 1 - End 2013-10-25 16:55:36 - Script 2 - End 2013-10-25 16:55:36 - Arret du launcher
La fin des deux scripts est bien synchronisée : le script principal attend la fin des deux autres scripts pour se terminer.
Ceci peut être intéressant par exemple pour des scripts de backup ou de maintenance du système, dans lequel plusieurs actions pourraient être lancées en parallèle, tout en devant se synchroniser avant un arrêt ou un démarrage des services, par exemple.