2013-03-26 2 views
46

J'ai un script bash qui contient d'autres scripts exécutés en série. Cependant, il faut un temps décent pour les exécuter tous. Existe-t-il un moyen d'exécuter ces scripts en parallèle pour améliorer la performance globale? Ils sont indépendants les uns des autres.Exécution de plusieurs scripts dans un script bash parallèle

Il ressemble à:

#!/bin/bash 

#some code here 
cppcheck.sh 
churn.sh 
run.sh 

Mise à jour:

**git log --pretty=format: --numstat | perl -ane'$c{$F[2]} += abs($F[0]+$F[1]) 
if $F[2];END {print "$_\t$c{$_}\n" for sort keys %c}' > ${OUTPUT_DIR}/churn.txt** 
sed -i -e '/deps/d;/build/d;/translations/d;/tests/d' -e 30q ${OUTPUT_DIR}/churn.txt 
sort -r -n -t$'\t' -k2 ${OUTPUT_DIR}/churn.txt -o ${OUTPUT_DIR}/churn.txt 
echo "set term canvas size 1200, 800; set output '${OUTPUT_DIR}/output.html'; 
unset key; set bmargin at screen 0.4; set xtics rotate by -90 scale 0,0; 
set ylabel 'Number of lines changed (total)'; set title 'Files with high churn 
level';set boxwidth 0.7; set style fill solid; set noborder; 
plot '${OUTPUT_DIR}/churn.txt' using 2:xticlabels(1) with boxes" | gnuplot 
echo "finished running churn.sh!" 

C'est le code à l'intérieur churn.sh. La commande en gras prend environ 40 secondes pour être implémentée. Si dans un script principal je mets l'esperluette après churn.sh &, il jette une erreur disant que sed ne peut pas lire le fichier churn.txt (puisqu'il n'est pas encore créé). Il semble qu'il n'attend pas que la sortie soit enregistrée dans un fichier. J'ai inséré l'attente après cette commande, mais cela n'aide pas.

Répondre

91

Utilisation du & pour fonctionner en arrière-plan fera l'affaire

cppcheck.sh & 
churn.sh & 
run.sh & 

wait 
echo "All 3 complete" 

Il bifurquer un nouveau processus pour chacun d'eux.

Le bash wait sera également utile comme indiqué dans les commentaires, si vous avez quelque chose à être exécuté sur le script parent, après ces trois finition.

Sans argument, il attend que tous les processus fils se terminent, puis reprend l'exécution du script parent.


Les problèmes auxquels vous faites face semblent être directement liés à cela. Le jeu de variables n'est visible que par le sub-shell in which they are defined. Donc, si vous avez OUT_DIR spécifié dans le script parent, il ne sera pas visible pour le script enfant quand il se détache. La bonne chose à faire dans ce cas serait de export la variable comme variable d'environnement.

+15

En outre, un appel à 'wait' s'assurera que le script parent ne se termine pas tant que tous les jobs d'arrière-plan ne sont pas terminés –

+0

@DarkCthulhu Je l'ai déjà utilisé. Le problème est le suivant. Une ligne obtient les données de git en utilisant --numstat et les sort dans un fichier. Ce fichier est ensuite utilisé dans la ligne suivante, mais comme & command commence à exécuter la ligne et passe à la ligne suivante, la ligne suivante renvoie une erreur indiquant que le fichier n'existe pas, car il faut un certain temps pour obtenir les données et enregistrez-le dans un fichier txt. C'est un problème presque similaire dans tous les fichiers de script. – Bdar

+1

@Bdar Vous venez de dire que les scripts sont indépendants les uns des autres. Si vous voulez ajouter un peu de temps entre leurs exécutions, vous pouvez essayer 'sleep n && churn.sh &'. Sinon, vous feriez mieux de les exécuter en séquence. –

Questions connexes