У меня есть скрипт Python, который получает 1 аргумент командной строки

python arg

Теперь я хочу bash скрипт, который:

  • вызывает python arg & с аргументом arg = 000
  • сделать это x раз

И потому:

python 000 &
python 001 &
...
python 00x &

и если один из этих процессов завершается, скрипт должен создать новый процесс

python 00x+1 &

до числа N


Примечания:

  • Я прекрасно понимаю, что это звучит как уродливое решение того, что я пытаюсь сделать, - но я вынужден сделать это таким образом с помощью различного числа людей, которые находятся вне моей компетенции.
  • Я знаю, что я оставляю все (!) работы для сообщества, но все мои поиски и поиски пошли на ноль строк сценария, и поэтому я должен оставить все как есть.

РЕДАКТИРОВАТЬ: Мне нужно решение, которое не использует parallel .

2 ответа2

3

Звучит так, как будто вы хотите запустить несколько экземпляров скрипта Python параллельно, но запускать их одновременно столько раз, а когда один завершится, запустить другой. Для этого есть удобная утилита под названием "параллель", которую можно комбинировать с командой "seq" для генерации списка чисел.

 seq -f '%03.0f' 0 N | parallel -j x "python {}"

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

seq генерирует список номеров.

$ seq 5
1
2
3
4
5

$ seq 0 5
0
1
2
3
4
5

$ seq -f '%03.0f' 0 5
000
001
002
003
004
005

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

Параллельный -jx "command {}" запускает x копий команды одновременно каждый раз, заменяя {} одним из значений из списка, сгенерированного seq. Так что если у вас есть последовательность 000-100 и вы поставляете -j 3, она будет работать:

 python 000
 python 001
 python 002

Все одновременно. Когда один из этих выходов, скажем, "python 001" завершается первым, он запускает "python 003". Предположим, что "python 000" заканчивается следующим, он заменит "python 004" следующим и так далее, пока не завершит все 101 задание.

Очевидно, что вы не хотите устанавливать -j слишком высоко, иначе это приведет к перегрузке вашей системы.

seq - очень стандартная команда linux. Параллельно предлагается в качестве дополнительного пакета, устанавливаемого через менеджер пакетов для вашей системы. Как ни странно, системы на основе RedHat не включают его, но вы можете получить исходный код и двоичные файлы с официального сайта:

https://www.gnu.org/software/parallel/

1

Основываясь на предыдущем ответе, но вместо параллельного использования GNU, используем стандартную команду "xargs" с опцией -P:

seq -f '%03.0f' 0 999 | xargs -n 1 -P 4 python

Попробуйте это, чтобы увидеть, как процессы работают параллельно:

seq 0 10 | shuf | xargs -n 1 -P 3 -I % sh -c "echo start %; sleep %; echo done %"

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .