Пакетные задания 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 экземпляров среди нескольких компьютеров.
Напишите два сценария. Тот, который перезапускает задание каждый раз, когда он закончен, и тот, который запускает 7 раз первый скрипт
Подобно:
script1:
./script2 job1
...
./script2 job7
а также
script2:
while(...)
./jobX