linux - sous - shell unix




Commandes de traitement de script Bash en parallèle (3)

En fait, xargs peut exécuter des commandes en parallèle pour vous. Il existe une option de ligne de commande spéciale -P max_procs pour cela. Voir man xargs .

Cette question a déjà une réponse ici:

J'ai un script bash qui ressemble à ceci:

#!/bin/bash
wget LINK1 >/dev/null 2>&1
wget LINK2 >/dev/null 2>&1
wget LINK3 >/dev/null 2>&1
wget LINK4 >/dev/null 2>&1
# ..
# ..
wget LINK4000 >/dev/null 2>&1

Mais traiter chaque ligne jusqu'à la fin de la commande puis passer à la suivante prend beaucoup de temps, je veux traiter par exemple 20 lignes à la fois puis quand elles sont terminées, 20 autres lignes sont traitées.

J'ai pensé à wget LINK1 >/dev/null 2>&1 & pour envoyer la commande à l'arrière-plan et continuer, mais il y a 4000 lignes ici cela signifie que je vais avoir des problèmes de performance, sans parler du nombre de processus que je devrais Commencez en même temps, donc ce n'est pas une bonne idée.

Une solution à laquelle je pense en ce moment est de vérifier si l'une des commandes est toujours en cours ou non, par exemple après 20 lignes je peux ajouter cette boucle:

while [  $(ps -ef | grep KEYWORD | grep -v grep | wc -l) -gt 0 ]; do
sleep 1
done

Bien sûr, dans ce cas, je vais devoir ajouter et à la fin de la ligne! Mais je pense que ce n'est pas la bonne façon de le faire.

Donc, comment puis-je regrouper chaque 20 lignes ensemble et attendre qu'elles se terminent avant d'aller aux 20 prochaines lignes, ce script est généré dynamiquement afin que je puisse faire tout ce que je veux maths pendant qu'il est généré, mais il n'a pas à J'utilise wget, c'était juste un exemple, donc toute solution qui est spécifique à wget ne va pas me faire du bien.


Utilisez l' wait intégrée:

process1 &
process2 &
process3 &
process4 &
wait
process5 &
process6 &
process7 &
process8 &
wait

Pour l'exemple ci-dessus, 4 processus process1 .. process4 seront démarrés en arrière-plan, et le shell attendra que ceux-ci soient terminés avant de commencer l'ensemble suivant.

Du manual :

wait [jobspec or pid ...]

Attendez que le processus fils spécifié par chaque ID de processus ou ID de travail jobspec se ferme et renvoyez le statut de sortie de la dernière commande attendue. Si une spécification de travail est donnée, tous les processus du travail sont attendus. Si aucun argument n'est donné, tous les processus enfants actuellement actifs sont attendus et le statut de retour est zéro. Si ni jobspec ni pid ne spécifient un processus fils actif du shell, l'état de retour est 127.


Vous pouvez exécuter 20 processus et utiliser la commande:

wait

Votre script attendra et continuera lorsque tous vos travaux d'arrière-plan seront terminés.







shell