53 votes

Comment démarrer plusieurs processus dans Bash

Je veux démarrer 100 processus dans bash , mais l' for ne semble pas aimer le & et j'obtiens une erreur de syntaxe, ici c'est ce que j'ai pour l'instant :

 echo "Spawning 100 processes"
for i in {1..100}
do
    ./my_script.py &
done

EDIT : j'étais en train de copier-coller ce code, c'est pourquoi le caractère & était illégal.

73voto

datenwolf Points 85093
echo "Spawning 100 processes"
for i in {1..100} ;
do
    ( ./my_script & )
; done

20voto

Ole Tange Points 4907

Avec GNU Parallel vous pouvez faire :

 echo "Spawning 100 processes"
parallel -j0 ./my_script.py ::: {1..100}

Ou pour éviter l'argument 1 à 100 :

 parallel -j0 -N0 ./my_script.py ::: {1..100}

Sans -j0, il générera un processus par thread CPU.

Regardez les vidéos d'introduction pour plus de détails : https://www.youtube.com/playlist?list=PL284C9FF2488BC6D1

1voto

stefgosselin Points 5880

Comme d'autres l'ont noté, votre extrait est un code valide.

Je ne sais pas si c'est ce dont vous avez besoin... mais vous pouvez doubler :

 ( ( /complete/path/my_script.py & ) & )

Cela permettra à votre script de s'exécuter même si le shell à partir duquel il a été lancé est détruit.

1voto

Jorge Mendes Points 279

Dans cet exemple, nous avons 2 processus parallèles, basés sur différents arguments (nombres)

my_array=(1 2 3 4) ; printf '%s\n' "${my_array[@]}" | parallel -j 2 "echo {} &"

Vous pouvez remplacer my_array par quelque chose qui génère une sortie pour la commande echo (par exemple : find *tif -printf "%f\n" )

If peut également utiliser nohup pour empêcher le traitement de se terminer lorsque vous fermez une session ssh : nohup sh -c 'find *tif -printf "%f\n" | parallel -j 2 echo {}' &

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X