2016-02-14 2 views
0

У меня есть сценарий ожидания, который я использую для сбора интерфейсов на коммутаторах cisco. И у меня есть скрипт bash, который создает цикл. Входной файл был разделен на 8 частей (sw_aa - sw_ah с 6 строками каждый).Параллелизировать процессы для получения скорости

sw_aa 
169.254.253.2,169.254.253.1,169.254.253.1,sw_aa 
... 

sw_ab 
169.254.254.2,169.254.254.1,169.254.254.1,sw_ab 
... 

etc... 


loop.sh 
#!/bin/bash 
SW=($(cut -d "," -f 1 sw_??)) 
RT=($(cut -d "," -f 2 sw_??)) 
Pre=($(cut -d "," -f 3 sw_??)) 
lote=($(cut -d "," -f 4 sw_??)) 

for((i=0;i<${#SW[@]};i++)); do 
./ciscoswitches.sh "${SW[$i]} ${RT[$i]} ${Pre[$i]} ${lote[$i]}" >> ${SW[$i]}.log 
done 

Мне нужно распараллелить процессы, чтобы получить скорость, так что я могу атаковать первую строку каждого входного файла, а затем выполните петлю недо конца. Как я могу это сделать?

Спасибо.

+2

Использование GNU Parallel. Префикс второй к последней строке с помощью 'echo', то есть' echo ./ciscoswitches.sh ...' и добавьте '| параллельно "до последней строки. –

+0

@MarkSetchell, отличный ответ! Простой и удобный для чтения. Я сделал несколько тестов, и я получил результаты всего за 2 минуты! Большое спасибо! –

+0

Рад, что это работает для вас. Поздно, поэтому я напишу это как ответ завтра. –

ответ

1

Я не могу точно сказать, что вы пытаетесь сделать, но в целом, вы можете parallelise петлю, используя GNU Parallel путем создания списка команд, которые должны выполняться параллельно и отправлять их в GNU Parallel-х стандартный входной поток:

for((i=0;i<${#SW[@]};i++)); do 
    echo ./ciscoswitches.sh ... 
done | parallel 

вы можете посмотреть на добавление -j 8, например, если вы хотите запустить 8 параллельных процессов, а не стандарт 1 процесса для каждого ядра процессора. Кроме того, возможно, переключатель -k`, чтобы сохранить результат в порядке. Вы также можете пометить вывод каждого процесса.

Смежные вопросы