7
votes

Ajouter une attente entre les processus parallèles à bash

J'ai un script Bash pour télécharger des données sur un site. Je commençais à avoir des vitesses de téléchargement lents, alors j'ai commencé à le courir en parallèle, 5 en même temps, en utilisant Xargs et -N1.

Cependant, le problème est que le serveur me demande de résoudre un captcha si je l'exécute 5 à la fois, tandis que cela fonctionne bien avec 1 à la fois.

Je pense que c'est parce que tous les processus commencent exactement au même moment, je suis marqué.

Quoi qu'il en soit, voici la question, y a-t-il un moyen pour moi d'ajouter une attente (disons 1 seconde) entre processus de démarrage dans Xargs / GNU parallèle?

La seule chose que je pouvais trouver consiste à utiliser Script PGREP | WC -1 pour compter les instances de script et dormir pour ce nombre de secondes.

Cependant, ce n'est vraiment pas optimal, existe-t-il de meilleurs moyens de faire cela?


0 commentaires

4 Réponses :


0
votes

Vous pouvez suspendre votre exécution de script après chaque processus en utilisant xxx pré>

maintenant, vous pouvez décider, à la même volonté de démarrer le processus suivant. P>

Je suis d'accord Cela implique une intervention manuelle. Mais comme il n'y a que 5 processus à démarrer dans ce cas particulier, il devrait fonctionner correctement. P>

EDIT STRY>: Comme Lire code> arrête votre automatisation Peut utiliser P>

sleep 5 


2 commentaires

Malheureusement, cela ne fonctionnera pas pour moi>.


Mais dans ce cas puisque Xargs commence tous les processus presque instantanément, ils ne dormiront-ils pas tous seulement pendant 5 secondes puis commencer à la fois, causant le même problème?



2
votes

Plutôt que d'utiliser Xargs, je pense que vous voulez juste une boucle, comme dans xxx

cette fourchete des commandes toutes les 5 secondes. Pour un délai croissant (si tel est nécessaire): xxx

Une autre alternative: xxx


3 commentaires

J'utilise Xargs avec Trouver comme ceci: trouver. -Type f -Name "* .txt" -print0 | XARGS -0 -N 1 -P 5 / PATH / TO / Script /, et il y a beaucoup plus de 5 fichiers à traiter. Ne pensez pas que cela fonctionnera, désolé de ne pas être assez clair>. <


@Lelouch donc / chemin / to / script est un script que vous avez écrit. Pourquoi ne pas ré-écrire pour prendre 5 arguments et utiliser -n 5 -p 1 comme argument à Xargs.


Cela n'a pas eu lieu à moi, mais oui qui semble le seul moyen de le faire. Merci :)



2
votes

Ceci pourrait fonctionner pour vous (utilise GNU parallèle): xxx

Voici une session de terminal montrant un exemple exécuté: xxx comme Vous pouvez voir que chaque travail est lancé une seconde séparation, c'est-à-dire que le fichier C commence à 08 finitions à 13, fichier B 09 à 14 et fichier de 10 à 15.


3 commentaires

Enfin, il faut que cela fonctionne, il fallait un commutateur parallèle parallèle. J'ai essayé 'dormir; script {} ', et cela n'a pas fonctionné non plus. Je pense que je devrai faire comme Jim a dit ...


J'ai inclus un exemple. Le creux de la matière est la formation de / tmp / job {} & Sleep 1 suivi du sommeil pendant une seconde. N.b. C'est gnu parallèle pas plus d'autres.


Ouais ça marche, ce que je veux dire, c'est qu'il existe un moyen de limiter le nombre de processus? -J5 ne fonctionne plus, cela continuera à aller jusqu'à ce qu'il traite tous les centaines de fichiers ..



6
votes

Si le téléchargement prend une quantité de temps aléatoire, vous avez juste besoin des 5 premiers pour commencer avec un délai de 1 à 5 secondes:

cat list | parallel -j5 [ {#} -lt 6 ] \&\& sleep {#}\; upload {}


1 commentaires

Changé le bit de départ pour trouver, et cela fonctionne réellement! Je ne comprends même pas vraiment, mais merci beaucoup :)