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. P>
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. P>
Je pense que c'est parce que tous les processus commencent exactement au même moment, je suis marqué. P>
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. p>
Cependant, ce n'est vraiment pas optimal, existe-t-il de meilleurs moyens de faire cela? P>
4 Réponses :
Vous pouvez suspendre votre exécution de script après chaque processus en utilisant 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> Lire code> arrête votre automatisation Peut utiliser P>
sleep 5
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?
Plutôt que d'utiliser Xargs, je pense que vous voulez juste une boucle, comme dans cette fourchete des commandes toutes les 5 secondes. Pour un délai croissant (si tel est nécessaire): p> Une autre alternative: p>
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 :)
Ceci pourrait fonctionner pour vous (utilise GNU parallèle): Voici une session de terminal montrant un exemple exécuté: p>
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 code> 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 ..
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 {}
Changé le bit de départ pour trouver, et cela fonctionne réellement! Je ne comprends même pas vraiment, mais merci beaucoup :)