Named pipes sous Linux

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.

Catégorie: 

Tag: