Как запускать скрипты параллельно на удаленной машине?

Я могу ssh на удаленную машину с 64 ядрами. Допустим, мне нужно запустить 640 сценариев оболочки параллельно на этой машине. Как это сделать?

Я могу разделить 640 скриптов на 64 группы, каждый из 10 скриптов. Как я мог бы затем запускать каждую из этих групп параллельно , т. Е. Одну группу на каждом из одного из доступных ядер.

Будет ли скрипт формы

    ./script_A &
    ./script_B &
    ./script_C &
    ...

где script_A соответствует первой группе, script_B во вторую группу и т. д., достаточно?

Скрипты внутри одной группы, которые работают на одном ядре, нормально запускаются последовательно, но я хочу, чтобы группы запускались параллельно по всем ядрам.

16 голосов | спросил Tom 9 WedEurope/Moscow2015-12-09T16:39:56+03:00Europe/Moscow12bEurope/MoscowWed, 09 Dec 2015 16:39:56 +0300 2015, 16:39:56

4 ответа


5

Это будет работать, пока вам не нужно отслеживать вывод, и вы можете оставить сессию ssh открытой до тех пор, пока скрипты выполняются. Если любой из них неверен, я бы рекомендовал использовать screen с несколькими вкладками. Вы могли бы сделать что-то вроде

screen
for script in script_A script_B script_C; do
  screen -t "$script" ./$script
done;
ответил David King 9 WedEurope/Moscow2015-12-09T16:51:39+03:00Europe/Moscow12bEurope/MoscowWed, 09 Dec 2015 16:51:39 +0300 2015, 16:51:39
2

Для запуска и управления большим количеством заданий сценариев вам понадобится какое-то программное обеспечение для управления использованием ресурсов (CPU, память, приоритет), см. статус задания (ожидание, приостановка, запуск, завершение).

Для этого создан Grid-движок, например Sun Grid Engine ( http: //wiki.gridengine.info/wiki/index.php/Main_Page ) или Open Grid Scheduler ( http: //gridscheduler .sourceforge.net /). Вам необходимо, чтобы администратор установил для вас правильное программное обеспечение, прежде чем вы сможете начать. Администратор может быть рад сделать это, вместо того, чтобы видеть сотни процессов, запущенных на машине, и не имеет никакого контроля над ними.

В общем случае администратор определяет, сколько слотов можно разбить на машину, и вы отправляете задание в очередь и указываете, сколько слотов потребляет задание, механизм сетки будет контролировать общее использование системы и запускать в соответствии с политикой очередей, определенной администратором. например одновременно может выполняться не более x заданий x и т. д. остальная часть заданий будет находиться в очереди в состоянии ожидания и выпущена после завершения более ранних заданий.

ответил user2912207 9 WedEurope/Moscow2015-12-09T23:22:22+03:00Europe/Moscow12bEurope/MoscowWed, 09 Dec 2015 23:22:22 +0300 2015, 23:22:22
0

Вы можете попробовать распределенную оболочку. Загрузить с: http://sourceforge.net/projects/dsh/

ответил Yousri Fanous 16 WedEurope/Moscow2015-12-16T19:55:01+03:00Europe/Moscow12bEurope/MoscowWed, 16 Dec 2015 19:55:01 +0300 2015, 19:55:01
0

Я делал это несколько раз и обычно просто сворачиваю свой собственный скрипт, чтобы выполнять работу с контролем работы. В общем случае, если у вас есть имена всех скриптов, которые вы хотите запустить в файле, решение выглядит так:

#!/bin/bash
scripts=$(cat scriptfiles.txt)
declare -i NUM=0
declare -i MAX_PROCS=30
for script in "$scripts"
do
  NUM=$((NUM+1))
  ssh remote.host.ip "${script}" > ${script}.log 2>&1 &
  if [ $NUM -ge $MAX_PROCS ];then
    echo "Waiting for $NUM processes to finish."
    wait
    NUM=0
  fi
done
echo "Waiting for final $NUM processes to finish."
wait
exit

Это грубая сила, но эффективная. Кроме того, вам не нужно добавлять дополнительные дополнительные программы, такие как параллель, в свои системы.

Большая проблема заключается в том, что команда wait будет ждать завершения самого медленного скрипта, который может тратить время. Я создал сценарии, чтобы позаботиться об этой ситуации, но они становятся более сложными, как вы можете себе представить. Если все ваши скрипты работают примерно столько же времени, это хорошо работает.

Другая проблема заключается в том, что вам может потребоваться настроить MAX_PROCS для определения наилучшей производительности.

Конечно, количество соединений ssh ​​может стать громоздким. В этом случае просто переместите этот сценарий на удаленный хост и измените строку «ssh ...», чтобы просто запустить скрипты напрямую.

ответил OldTimer 19 SatEurope/Moscow2015-12-19T00:55:41+03:00Europe/Moscow12bEurope/MoscowSat, 19 Dec 2015 00:55:41 +0300 2015, 00:55:41

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132