GNU/Linux >> Tutoriels Linux >  >> Linux

Exécuter des commandes canalisées en parallèle ?

Considérez le scénario suivant. J'ai deux programmes A et B. Le programme A sort sur des lignes de chaînes stdout tandis que le programme B traite les lignes de stdin. La façon d'utiliser ces deux programmes est bien sûr :

[protégé par e-mail] :~$ A | B

Maintenant, j'ai remarqué que cela ne consomme qu'un seul noyau; donc je me demande :

Les programmes A et B partagent-ils les mêmes ressources de calcul ? Si oui, existe-t-il un moyen d'exécuter A et B simultanément ?

Une autre chose que j'ai remarquée est que A s'exécute beaucoup plus rapidement que B, donc je me demande s'il pourrait en quelque sorte exécuter plus de programmes B et les laisser traiter les lignes que A sort en parallèle.

Autrement dit, A sortirait ses lignes, et il y aurait N instances de programmes B qui liraient ces lignes (celui qui les lit en premier), les traiterait et les sortirait sur stdout.

Donc ma dernière question est :

Existe-t-il un moyen de diriger la sortie vers A parmi plusieurs processus B sans avoir à s'occuper des conditions de concurrence et autres incohérences qui pourraient éventuellement survenir ?

Réponse acceptée :

Un problème avec split --filter est que la sortie peut être mélangée, vous obtenez donc une demi-ligne du processus 1 suivie d'une demi-ligne du processus 2.

GNU Parallel garantit qu'il n'y aura pas de confusion.

Supposons donc que vous vouliez faire :

 A | B | C

Mais ce B est terriblement lent, et donc vous voulez le paralléliser. Ensuite, vous pouvez faire :

A | parallel --pipe B | C

GNU Parallel se divise par défaut sur \n et une taille de bloc de 1 Mo. Cela peut être ajusté avec –recend et –block.

Vous pouvez en savoir plus sur GNU Parallel à :http://www.gnu.org/s/parallel/

Vous pouvez installer GNU Parallel en seulement 10 secondes avec :

$ (wget -O - pi.dk/3 || lynx -source pi.dk/3 || curl pi.dk/3/ || \
   fetch -o - http://pi.dk/3 ) > install.sh
$ sha1sum install.sh | grep 67bd7bc7dc20aff99eb8f1266574dadb
12345678 67bd7bc7 dc20aff9 9eb8f126 6574dadb
$ md5sum install.sh | grep b7a15cdbb07fb6e11b0338577bc1780f
b7a15cdb b07fb6e1 1b033857 7bc1780f
$ sha512sum install.sh | grep 186000b62b66969d7506ca4f885e0c80e02a22444
6f25960b d4b90cf6 ba5b76de c1acdf39 f3d24249 72930394 a4164351 93a7668d
21ff9839 6f920be5 186000b6 2b66969d 7506ca4f 885e0c80 e02a2244 40e8a43f
$ bash install.sh

Regardez la vidéo d'introduction sur http://www.youtube.com/playlist?list=PL284C9FF2488BC6D1


Linux
  1. Commandes RPM

  2. Aide-mémoire des commandes IPtables

  3. Commandes Linux de A à Z

  4. Commandes de recherche Linux

  5. Commande d'écho Linux

5 erreurs de débutant Linux

Commandes Nmap avec exemples

5 commandes de dépannage du réseau Linux

Mes 8 commandes Linux pratiques préférées

Commandes YUM

Les commandes d'un script bash s'exécutent-elles en parallèle ou l'une après l'autre ?