Як запускати сценарії паралельно на віддаленій машині?


16

Я можу вступити у віддалену машину з 64 ядрами. Скажімо, мені потрібно паралельно запускати 640 скриптів оболонки на цій машині. Як це зробити?

Я бачу розбиття 640 скриптів на 64 групи кожен з 10 сценаріїв. Як я б тоді запускав кожну з цих груп паралельно , тобто по одній групі на кожному з наявних ядер.

Буде сценарій форми

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

де script_Aвідповідає першій групі, script_Bдругій групі тощо, достатньо?

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


Не гарантується, що вони розподілені по стрижнях рівномірно. Погляньте на цю нитку. stackoverflow.com/questions/13583146/…
Rui F Ribeiro

Відповіді:


24

Це виглядає як робота для gnu паралельно:

parallel bash -c ::: script_*

Перевага полягає в тому, що вам не доведеться групувати сценарії за ядрами, parallelце зробить це за вас.

Звичайно, якщо ви не хочете відвідувати сеанс SSH під час виконання скриптів, ви повинні використовувати nohupабоscreen


Це хороша відповідь, і я приймаю це, оскільки в загальному випадку це спрацювало б добре. На жаль, для мене особисто я не маю привілеїв адміністратора на віддаленій машині, тому не можу встановити parallelпакет. Дякую`
Том

10
Не потрібно встановлювати паралельно глобально: ви повинні мати змогу запустити копію з власного домашнього каталогу.
дхаг

bash -cможе бути непотрібними: parallel ::: ./script*. Із сценарієм 640, ймовірно, вони дуже схожі (наприклад, лише аргумент відрізняється). Для цього розгляньте можливість використання GNU Parallel безпосередньо для встановлення цих аргументів та використання одного сценарію.
Оле Танге

Як я можу встановити gnu паралельно на віддаленій машині?
Том

@Tom Що змінюється тим, що ви використовуєте віддалений апарат? Просто дістаньте правильний пакет від gnu.org/software/parallel та встановіть.
Дмитро Григор’єв

5

Це буде працювати до тих пір, поки вам не потрібно буде стежити за результатами, і ви все в порядку залишаєте сеанс ssh відкритим до тих пір, поки сценарії займуться. Якщо будь-яке з них не відповідає дійсності, я б рекомендував використовувати screenкілька вкладок. Ви могли зробити щось подібне

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

Моніторинг результатів, якими я не переймаюся - я не хотів би залишати сеанс ssh відкритим. Що з використанням nohup? Це не дозволить скриптам зупинитися, якщо сеанс закінчиться ні? Я також ознайомлюсь з вашою рекомендацією на екрані. Спасибі!'
Том

nohupНапевно, це спрацює, я просто більше знайомий, screenі він має набагато більше функціональних можливостей, які можуть вам бути корисними.
Девід Кінг

2

Щоб розпочати та керувати великою кількістю скриптових завдань, вам знадобиться якесь програмне забезпечення для управління використанням ресурсів (процесор, пам'ять, пріоритет), перегляньте стан завдання (зачекайте, призупиніть, запустіть, закінчите).

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

Загалом, адміністратор визначає, на скільки слотів може бути поділена машина, і ви подаєте завдання до черги та вказуєте, скільки слотів робота хоче використовувати, сітка двигуна буде контролювати загальне використання системи та виконувати завдання відповідно до політика встановлення черги, визначена адміністратором. наприклад, одночасно може працювати не більше x завдань тощо. Решта завдань будуть знаходитись у черзі в стані очікування та звільнятись після попереднього завершення завдань.



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

Це груба сила, але ефективна. Крім того, вам не потрібне додаткове програмне забезпечення, наприклад паралельне, додане до ваших систем.

Велика проблема полягає в тому, що команда очікування чекатиме завершення найповільнішого сценарію, що може втратити час. Я створив сценарії для вирішення цієї ситуації, але вони складніші, як ви можете собі уявити. Якщо всі ваші сценарії працюють приблизно за однаковий час, це добре працює.

Ще одна проблема - можливо, вам доведеться налаштувати MAX_PROCS, щоб визначити найкращу ефективність.

Звичайно, кількість ssh-з'єднань може стати непростим. У такому випадку просто перенесіть цей скрипт на віддалений хост і змініть рядок "ssh ...", щоб просто запустити сценарії безпосередньо.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.