2017-04-26 2 views
3

J'ai un script shell job.sh.Exécuter le script shell en parallèle dans bash/linux

contenu sont ci-dessous:

#!/bin/bash 

table=$1 

sqoop job --exec ${table} 

Maintenant, quand je fais ./job.sh table1

Le script exécute avec succès. J'ai les noms des tables dans un fichier tables.txt.

Maintenant, je veux boucler sur le fichier tables.txt et exécuter le script job.sh 10 fois en parallèle.

Comment puis-je faire cela?

Idéalement, quand j'exécute le script, je veux le faire comme ci-dessous;

./job.sh table1 
./job.sh table2 
./job.sh table3 
./job.sh table4 
./job.sh table5 
./job.sh table6 
./job.sh table7 
./job.sh table8 
./job.sh table9 
./job.sh table10 

Quelles sont les options disponibles?

Répondre

3

Vous pouvez juste faire

< tables.txt xargs -I% -n1 -P10 echo sqoop job --exec % 

la -P10 se déroulera 10 processus en parallèle. Et vous n'avez même pas besoin du script d'aide. Comme @CharlesDuffy l'a commenté, vous n'avez pas besoin de -I, par exemple,

encore plus simple:

< tables.txt xargs -n1 -P10 echo sqoop job --exec 
+0

@CharlesDuffy vrai! Le '-I' n'est pas nécessaire dans ce cas. cela pourrait être utile dans le cas où 'printf"% s \ n "{1..20} | xargs -I% -n1 -P10 echo sqoop travail --exec table% ' – jm666

+0

Bien sûr, bien que l'on puisse utiliser' table {1..20} 'là aussi, et éviter la pilosité qui vient avec' -I'. Certes, la limite de chaîne de 255 octets n'est pas un problème * immédiat * et la tendance à être abusée de manière à provoquer des attaques par injection ou la limite spécifiée par POSIX sur le nombre de substitutions par ligne de commande (ou 5), mais c'est quelque chose qui me frappe comme une odeur. –

0

Option 1

tous les scripts de démarrage en tant que processus d'arrière-plan en adjoignant &, par exemple

./job.sh table1 & 
./job.sh table2 & 
./job.sh table3 & 

Cependant, tous les travaux seront exécutés en même temps!

Option 2

Pour plus de temps ou des scripts consommateurs de mémoire, vous pouvez exécuter un nombre limité de tâches en même temps en utilisant xargs comme par exemple décrit here.

5

simplement avec GNU Parallel

parallel -a tables.txt --dry-run sqoop job --exec {} 

Exemple de sortie

sqoop job --exec table7 
sqoop job --exec table8 
sqoop job --exec table9 
sqoop job --exec table6 
sqoop job --exec table5 
sqoop job --exec table4 
sqoop job --exec table3 
sqoop job --exec table2 
sqoop job --exec table1 
sqoop job --exec table10 

Si cela semble correct, il suffit de retirer le nouveau --dry-run et courir pour de vrai.

Si vous souhaitez 4 emplois courir à un moment, utilisez:

parallel -j 4 .... 

Si vous voulez un emploi par cœur de processeur, qui est la valeur par défaut, de sorte que vous ne avez pas besoin de faire quoi que ce soit.

Si vous souhaitez que les emplois à tenir dans l'ordre, ajouter l'option -k:

parallel -k ... 
+0

@CharlesDuffy Je ne l'ai pas vu mentionné que OP avait busybox, je m'attendais à une machine assez décemment spécifiée si l'on exécute 'sqoop'. –

+0

Vous avez raison - j'ai dû réfléchir à une question différente. –