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

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

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

Будет ли сценарий формы

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

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

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

Это похоже на работу для gnu parallel:

 parallel bash -c ::: script_* 

Преимущество заключается в том, что вам не нужно группировать свои скрипты по ядрам, parallel это сделает для вас.

Конечно, если вы не хотите присматривать за сеансом SSH во время работы скриптов, вы должны использовать nohup или screen

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

 screen for script in script_A script_B script_C; do screen -t "$script" ./$script done; 

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

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

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

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

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

 #!/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 …», чтобы просто запустить скрипты напрямую.