Пакетные задания linux параллельно

У меня семь лицензий на конкретное программное обеспечение. Поэтому я хочу начать 7 рабочих мест одновременно. Я могу сделать это используя '&'. Теперь команда wait ожидает завершения всех этих 7 процессов, чтобы завершить следующие 7. Теперь я хотел бы написать сценарий оболочки, в котором после запуска первых семи, как и когда задание завершается Я хотел бы начать другое. Это потому, что некоторые из этих 7 рабочих мест могут занять очень много времени, в то время как другие быстро заканчивают работу. Я не хочу терять время, ожидая, пока все они закончат. Есть ли способ сделать это в Linux? Не могли бы вы мне помочь?

Благодарю.

4 ответа

Решение

Вы можете проверить, сколько в данный момент работает, и начать больше, если у вас меньше 7:

while true; do
    if [ "`ps ax -o comm | grep process-name | wc -l`" -lt 7 ]; then
        process-name &
    fi
    sleep 1
done

GNUparallel это путь Он предназначен для запуска нескольких экземпляров одной и той же команды, каждый с различным аргументом, полученным из stdin или внешний файл.

Допустим, ваш лицензионный скрипт называется myScriptкаждый экземпляр имеет одинаковые параметры --arg1 --arg2 и принимая переменный параметр --argVariable для каждого порожденного экземпляра эти параметры сохраняются в файле myParameters:

cat myParameters | parallel -halt 1 --jobs 7 ./myScript --arg1 --argVariable {} --arg2

Пояснения:

  • -halt 1 говорит parallel остановить все работы, если кто-то потерпит неудачу
  • --jobs 7 запустит 7 экземпляров myScript

В системе Linux на основе Debian вы можете установить parallel с помощью:

sudo apt-get install parallel

В качестве бонуса, если ваши лицензии позволяют, вы можете даже сказать parallel запустить эти 7 экземпляров среди нескольких компьютеров.

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

Напишите два сценария. Тот, который перезапускает задание каждый раз, когда он закончен, и тот, который запускает 7 раз первый скрипт

Подобно:

script1:

./script2 job1
...
./script2 job7

а также

script2:

while(...)
  ./jobX
Другие вопросы по тегам