Supposons que j'ai trois (ou plus) scripts bash: script1.sh
, script2.sh
et script3.sh
. Je voudrais appeler ces trois scripts et les exécuter en parallèle . Pour ce faire, vous pouvez simplement exécuter les commandes suivantes:
nohup bash script1.sh &
nohup bash script2.sh &
nohup bash script3.sh &
(En général, les scripts peuvent prendre plusieurs heures ou jours pour se terminer, je voudrais donc les utiliser nohup
pour qu'ils continuent de fonctionner même si ma console se ferme.)
Mais, existe-t-il un moyen d'exécuter ces trois commandes en parallèle avec un seul appel?
Je pensais à quelque chose comme
nohup bash script{1..3}.sh &
mais cela semble s'exécuter script1.sh
, script2.sh
et script3.sh
en séquence, pas en parallèle.
nohup bash script{1..100}.sh &
oufor i in {1..100}; do nohup bash script{1..100} &; done
), plutôt que de tapernohup bash script*.sh &
100 fois différents.screen
(outmux
), afin de résoudre le problème de la console, mais garder l'accès à la sortie (et à l'entrée).nohup ... & nohup ... & nohup ... &
. Si vous voulez plutôt exécuter tous les scripts sans taper chaque nom de script individuellement, une simple boucle le fera.Réponses:
la source
Une meilleure façon serait d'utiliser GNU Parallel . GNU parallèle est simple et avec lui, nous pouvons contrôler le nombre de travaux à exécuter en parallèle avec plus de contrôle sur les travaux.
Dans la commande ci-dessous,
script{1..3}.sh
est développé et envoyé en tant qu'argumentsbash
en parallèle. Ici-j0
indique que le plus de travaux doivent être exécutés que possible. Par défaut,parallel
exécute un travail pour un cœur de processeur.Et vous pouvez également essayer d'utiliser
Lors de l'exécution de la deuxième méthode si vous obtenez un message d'erreur, cela signifie que l'
--tollef
option est définie/etc/parallel/config
et qu'elle doit être supprimée et tout fonctionnera correctement.Vous pouvez lire la
GNU Parallels
page de manuel ici pour des options plus riches.Et dans le cas où vous exécutez les travaux à partir d'une machine distante, mieux vaut l'utiliser
screen
afin que la session ne soit pas fermée en raison de problèmes de réseau.nohup
n'est pas nécessaire, car les versions récentes de bash sont fournies avechuponexit
asoff
et cela empêchera le shell parent d'envoyer unHUP
signal à ses enfants lors de sa sortie. Dans le cas où ce n'est pas mal réglé, faites-le avecla source
bash
car le shellparallel -j0 bash :::: <(ls script{1..3}.sh)
peut être réduit àparallel -j0 bash :::: script{1..3}.sh
, non?parallel -j0 bash ::: script{1..3}.sh
?bash ::: script{1..3}.sh
est transmis àparallel
, non::: script{1..3}.sh
. Donc , cela devrait d' abord étendre àparallel bash ::: script1.sh script2.sh script3.sh
par la coquille, puisparallel
invocationsbash script1.sh
,bash script2.sh
,bash script3.sh
. Je l'ai essayéparallel -j0 bash ::: script{1..3}.sh
- c'est mieux que l'::::
approche car cela évite le besoin de substitution de processus. L' analyse de la sortie ls est égalementNous pouvons également utiliser
xargs
pour exécuter plusieurs scripts en parallèle.ici, chaque script est passé à bash comme argument séparément.
-P 0
indique que le nombre de processus parallèles peut être autant que possible. Il est également plus sûr d'utiliser bash par défautjob control feature
(&)
.la source
Une seule ligne solution:
Moins facétieusement, utilisez simplement un script wrapper:
Ou bouclez-les:
la source
Si vous cherchez à vous épargner quelques efforts de frappe
Ou à y réfléchir, peut-être pas
la source
Découvrez cet outil: https://github.com/wagoodman/bashful
Dis que tu as
mytasks.yaml
avecEt vous le faites comme ça:
Vos scripts seraient exécutés en parallèle avec une barre de progression verticale (+ eta si vous l'avez déjà exécuté et que l'heure est déterministe). Vous pouvez modifier le nombre de tâches que vous souhaitez exécuter en parallèle si vous commencez à exécuter plus que les 3 données ici:
Avertissement: je suis l'auteur.
la source
Je propose un utilitaire beaucoup plus simple que je viens d'écrire. Il est actuellement appelé par, mais sera renommé bientôt en parl ou en pll, pas encore décidé.
https://github.com/k-bx/par
L'API est aussi simple que:
la source
Utilisez Parallelshell
https://github.com/keithamus/parallelshell
la source