Supposons que j'ai cinq .sh
scripts Bash ( ) dans un dossier ( my_folder
), et ils sont nommés comme suit:
script_1.sh
script_2.sh
script_3.sh
script_4.sh
script_5.sh
Comment puis-je écrire un sixième script Bash ou juste un liner qui commencera à exécuter tous ces scripts ensemble?
J'ai besoin des cinq scripts pour commencer à fonctionner tous ensemble en même temps et pas l'un après l'autre.
Réponses:
GNU
parallel
est parfait pour ce genre de chose. Installez avecsudo apt install parallel
puis:Le
-j
contrôle le nombre de processus exécutés en parallèle et-j0
signifie «tous». Définissez-le sur une autre valeur (par exemple-j20
) pour exécuter les scripts par lots à la place.la source
parallel
commande dumoreutils
package. L'exemple d'utilisation:parallel -j 20 -- my_folder/*.sh
(Contrairement à GNUparallel
,-j0
exécuter les scripts un par un).sudo apt install parallel
cela remplacera le fichier/usr/bin/parallel
par celui du parallèle GNU. Donc, tant que vous l'installez, comme ma réponse le suggère, cela devrait fonctionner comme prévu.parallel
commandes du manuel lors de l'écriture de ma réponse pour suggérer GNU parallèle.Pour exécuter tous les scripts en même temps (en parallèle), utilisez:
Pour exécuter l'un après l'autre (séquentiellement), utilisez:
Amélioration des commentaires
Si vous avez 200 scripts que vous souhaitez exécuter en même temps (ce qui pourrait enliser la machine BTW), utilisez ce script:
Définissez les attributs de script sur exécutable avec la commande:
La première fois que vous exécutez le script, il ne fera écho que les noms des 200 scripts qu'il exécutera. Lorsque vous êtes satisfait des bons noms, modifiez le script et modifiez cette ligne:
à:
Il existe trois façons d'appeler un script bash à partir d'un autre, comme indiqué ici:
Dans le cas d'OP, un ou plusieurs des 200 scripts ne contenaient pas la
#!/bin/bash
première ligne de shebang dans le fichier. En tant que telle, l'option 3. devait être utilisée.200 scripts exécutés en même temps
Un commentaire a été soulevé quant à savoir s'ils "fonctionnent en même temps". Sur un système typique à 8 CPU, 25 scripts partageront un CPU en même temps, mais un seul script s'exécutera à la fois jusqu'à ce que sa tranche de temps (mesurée en millisecondes) s'épuise. Ensuite, le prochain travail recevra sa juste part de millisecondes, puis le prochain travail, etc., etc.
En termes vagues, nous pouvons dire que 200 travaux s'exécutent "simultanément" mais pas "simultanément" sur 8 processeurs, ce qui équivaut à 25 travaux par processeur:
Image ci-dessus et commentaires ci-dessous du planificateur du noyau Linux
la source
bash
préfixe pour appeler le script.Il y a un outil pour cela, lisez
man run-parts
.Par exemple, je fais:
dans mon script de sauvegarde Palm Pilot.
${visorhome}/pbackup.d/
:la source
run-parts
exécute les scripts de manière séquentielle plutôt que d'un seul coup, comme l'OP l'a demandé. Cependant, vous avez raison, il est peu probable que l'exécution de 200 scripts à la fois soit identique à l'exécution de 5 - et même si les exécuter tous en même temps ne pose aucun problème, cela peut quand même être inutile. J'ai commenté pour suggérer au PO de clarifier ses préférences à cet égard.run-parts
ne lancera pas les scripts (ils ont un point dans le nom:my_folder/*.sh
run-parts
a des exigences de nom de fichier très spécifiques pour une raison étrange. Il ne lancera pas de noms de fichiers avec des extensions, donc je crains que cela ne fonctionne pas ici.Pour exécuter tous les
*.sh
scripts dumy_folder
répertoire en même temps en utilisantxargs
:Pour limiter le nombre de scripts exécutés simultanément à
10
:la source
ls
dans un script. L'utilisationfind
est beaucoup plus sûre. C'est le tout premier élément ici: mywiki.wooledge.org/BashPitfalls#for_f_in_.24.28ls_.2A.mp3.29