Scripting : forker pour une fonction interne
Posted by Daniel on 26 Oct 2009 at 09:00 | Tagged as: unix
Derrière ce titre un peu barbare (nos amis anglophobes me pardonneront, j'espère) se cache une question finalement très simple : dans un script, on sait que si chaque appel à une commande externe va générer un nouveau processus au niveau du système, ce n'est pas le cas pour les fonctions définies en interne dans le script. Or, on peut parfois souhaiter exécuter une telle fonction de manière séparée, par exemple à des fins de parallélisation.Il existe une solution on ne peut plus simple pour répondre à ce besoin : l'opérateur $(). Voici un petit exemple d'utilisation, avec un script nommé make_child :
#!/bin/ksh longue() { echo "Debut de la fonction longue : \c" date +"%H:%M:%S" sleep 30 echo "Fin de la fonction longue : \c" date +"%H:%M:%S" } courte() { echo "Debut de la fonction courte : \c" date +"%H:%M:%S" echo "Fin de la fonction courte : \c" date +"%H:%M:%S" } ( longue ) & sleep 1 ( courte ) &
Dans cet exemple, les deux fonctions longue et courte sont appelées en parallèle. Le délai d'une seconde entre l'appel des deux fonctions n'est là que pour éviter une imbrication de leurs affichages, que voici :
$ ./make_child Debut de la fonction longue : 19:01:07 Debut de la fonction courte : 19:01:08 Fin de la fonction courte : 19:01:08 $ Fin de la fonction longue : 19:01:37Cette pause de 30 secondes nous laisse le temps d'observer les processus :
$ ps -edf | grep child toto 15398 1 0 21:53:51 pts/16 0:00 /bin/ksh bin/make_child $ ptree 15398 15398 /bin/ksh bin/make_child 15401 sleep 30
On constate bien qu'un second process a été créé, à partir d'une fonction interne au script. On notera également que la présence du "&" au niveau des appels des fonctions oblige le script à passer en arrière-plan et à rendre la main à l'utilisateur, le temps que le processus fils se termine.