Параллельный запуск команд из shell скрипта в *NIX


Терминал. Параллельный запуск команд из shell скрипта в *NIXВнезапно на сотне *NIX серверов пришлось запустить несколько одинаковых, но долгих по времени выполнения команд. Для того, чтобы ускорить процесс и обрабатывать серверы не последовательно, а параллельно, я написал простенький sh-скрипт, шаблон которого, я на всякий случай оставлю здесь. Хоть я сделал его для Solaris, но подогнать его под любой другой *NIX не составит труда.

jobs="one two three"

# execute parallel commands
for job in $jobs
do
   # Run the job
   echo $job && sleep 5 &

   # Save PID
   echo $! >> bparallel.pid
done

# job control loop
while [ `ps | /usr/xpg4/bin/grep -f bparallel.pid | wc -l` -ne 0 ]
do
   date
   ps | /usr/xpg4/bin/grep -f bparallel.pid
   sleep 1
done

rm -rf bparallel.pid
echo "done"

В цикле for запускаем три «джоба», а чтобы не дожидаться выполнения каждого предыдущего задания, используем «&», за счет чего и получаем условную параллельность выполнения джобов. В примере sleep 5 используется только для наглядности, чтобы растянуть время выполнения каждого задания. Пр помощи «echo $! >> bparallel.pid» сохраняем идентификаторы запущенных процессов в файл.

Цикл while контролирует завершение каждого джоба, путем сравнивания содержимого файла bparallel.pid и списка работающих в системе процессов. Для наглядности, список активных джобов на текущее время также выводится на экран. В конце цикла пауза в 1-у секунду устанавливает интервал проверки состояния джобов.

Как видим, ничего сложного. Нужно только обратить внимание на grep и его ключах, поскольку в разных *NIX, существуют и разные варианты этой команды.

Результат выполнения. Основная часть заданий — echo $job выполнены сразу. Остальное время работают sleep, пока не истечет 5-и секундный интервал.

> ./bparallel.sh
one
two
three
Tue Jul 10 15:46:18 MSK 2012
 10572 pts/1    0:00 sleep
 10571 pts/1    0:00 sleep
 10573 pts/1    0:00 sleep
Tue Jul 10 15:46:19 MSK 2012
 10572 pts/1    0:00 sleep
 10571 pts/1    0:00 sleep
 10573 pts/1    0:00 sleep
Tue Jul 10 15:46:20 MSK 2012
 10572 pts/1    0:00 sleep
 10571 pts/1    0:00 sleep
 10573 pts/1    0:00 sleep
Tue Jul 10 15:46:21 MSK 2012
 10572 pts/1    0:00 sleep
 10571 pts/1    0:00 sleep
 10573 pts/1    0:00 sleep
Tue Jul 10 15:46:22 MSK 2012
 10572 pts/1    0:00 sleep
 10571 pts/1    0:00 sleep
 10573 pts/1    0:00 sleep
done

 

Реклама

Добавить комментарий

Заполните поля или щелкните по значку, чтобы оставить свой комментарий:

Логотип WordPress.com

Для комментария используется ваша учётная запись WordPress.com. Выход / Изменить )

Фотография Twitter

Для комментария используется ваша учётная запись Twitter. Выход / Изменить )

Фотография Facebook

Для комментария используется ваша учётная запись Facebook. Выход / Изменить )

Google+ photo

Для комментария используется ваша учётная запись Google+. Выход / Изменить )

Connecting to %s