Добавьте ожидание между параллельными процессами в bash - PullRequest
5 голосов
/ 10 марта 2012

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

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

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

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

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

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

Ответы [ 4 ]

4 голосов
/ 11 марта 2012

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

cat list | parallel -j5 [ {#} -lt 6 ] \&\& sleep {#}\; upload {}
2 голосов
/ 10 марта 2012

Вместо того, чтобы использовать 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
1 голос
/ 10 марта 2012

Это может сработать для вас (используется 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

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

0 голосов
/ 10 марта 2012

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

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

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

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

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

sleep 5 

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

...