Добавьте ожидание между параллельными процессами в bash

У меня есть скрипт bash для загрузки данных на сайт. Я получал медленные скорости загрузки, поэтому я начал запускать его параллельно, 5 одновременно, используя xargs и -N1.

Однако проблема в том, что сервер просит меня ввести капчу, если я запускаю ее по 5 за раз, тогда как она отлично работает с 1 за раз.

Я полагаю, что это потому, что все процессы запускаются в одно и то же время, я отмечен.

В любом случае, вот в чем вопрос, есть ли способ добавить ожидание (скажем, 1 секунду) между запускающимися процессами в xargs/gnu параллельно?

Единственное, что я мог придумать, это использовать скрипт pgrep | wc -1 для подсчета экземпляров скрипта и ожидания в течение этого количества секунд.

Тем не менее, это действительно не оптимально, есть ли лучшие способы сделать это?

5 ответов

Решение

Если загрузка занимает случайное количество времени, вам просто нужно первые 5, чтобы начать с задержкой в ​​1-5 секунд:

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

Вместо того, чтобы использовать xargs, я думаю, что вы просто хотите цикл, как в

for i in {1..5}; do sleep 5; your-command & done

Это отменяет команды каждые 5 секунд. Для увеличения задержки (если это необходимо):

for i in {1..5}; do ((w=i*5)); sleep $w; your-command & done

Другая альтернатива:

files="a.txt b.txt c.txt"
for i in $files; do upload-command $i& sleep 5; done

Это может работать для вас (использует GNU параллельно):

 find . -type f -name "*.txt" -print | parallel 'script {} & sleep 1'

Вот сеанс терминала, показывающий пример выполнения:

for x in {a..c};do for y in {1..3};do echo $x >>$x;done;done
ls
a  b  c
cat a
a
a
a
cat /tmp/job
#!/bin/bash
sed -i -e '1e date' -e 's/./\U&/' $1
sleep 5
sed -i '${p;s,.*,date,e}' $1
find . -type f -name "?" -print | parallel '/tmp/job {} & sleep 1'
cat ?
Sat Mar 10 20:25:10 GMT-1 2012
A
A
A
Sat Mar 10 20:25:15 GMT-1 2012
Sat Mar 10 20:25:09 GMT-1 2012
B
B
B
Sat Mar 10 20:25:14 GMT-1 2012
Sat Mar 10 20:25:08 GMT-1 2012
C
C
C
Sat Mar 10 20:25:13 GMT-1 2012

Как вы можете видеть, каждое задание начинается с точностью до секунды, то есть файл c начинается с 08, заканчивается в 13, файл b 09-14 и файл 10-15.

В GNU-параллели есть--delayвариант, который можно использовать для этой цели. Это предотвращает одновременный запуск заданий и гарантирует минимальную задержку между запусками. С использованием

      cat list | parallel -j5 --delay 5s upload {}

будет гарантировать, что каждыйuploadинтервал выполнения составляет не менее 5 секунд.

Вы можете приостановить выполнение скрипта после каждого процесса, используя

read -p "Press [Enter] key to continue..".

Теперь вы можете сами решить, когда начинать следующий процесс.

Я согласен, что это предполагает ручное вмешательство. Но поскольку в данном конкретном случае нужно запустить только 5 процессов, все должно работать нормально.

РЕДАКТИРОВАТЬ: Как read останавливает вашу автоматизацию вы можете использовать

sleep 5 

который будет спать в течение 5 секунд.

Другие вопросы по тегам