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

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

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

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

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

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

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

4 ответа

Если загрузка занимает определенное количество времени, вам просто нужно, чтобы первые 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.


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

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

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

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

EDIT. Поскольку read останавливает автоматизацию, вы можете использовать

sleep 5

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

licensed under cc by-sa 3.0 with attribution.