Параллельный запуск команд из 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

2012 год

Advertisements

About mezzantrop

10 years of experience in large SAN and storage environments: mainly Hitachi, HP and Brocade. Now I am a proud SAN/storage IBMer. Empty – expect-like tool author. FreeBSD enthusiast.
This entry was posted in My projects, Very old stuff and tagged , , , , . Bookmark the permalink.

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s