Это правильный способ запустить несколько последовательных обработок в фоновом режиме?
for i in {1..10}; do
for j in {1..10}; do
run_command $i $j;
done &
done;
Все j
должны быть обработаны после друг друга для данного i
, но все i
должны быть обработаны одновременно.
bash
background-process
for
parallelism
Контролируется радио
источник
источник
Ответы:
Внешний цикл, который у вас есть, в основном
Это запустит десять одновременных экземпляров
some_compound_command
в фоновом режиме. Они будут запущены настолько быстро, насколько это возможно, но не совсем «все одновременно» (то есть, если этоsome_compound_command
занимает очень мало времени, первое может закончиться раньше, чем начнется последнее).Тот факт, что
some_compound_command
это цикл, не важен. Это означает, что код, который вы показываете, верен в томj
смысле, что итерации внутреннего цикла будут выполняться последовательно, но все экземпляры внутреннего цикла (по одному на итерацию внешнегоi
цикла) будут запускаться одновременно.Единственное, что нужно иметь в виду, это то, что каждое фоновое задание будет выполняться в подоболочке. Это означает, что изменения, внесенные в среду (например, изменения значений переменных оболочки, изменения текущего рабочего каталога с помощью
cd
и т. Д.) В одном экземпляре внутреннего цикла, не будут видны за пределами этого конкретного фонового задания.Возможно, вы захотите добавить
wait
оператор после цикла, просто чтобы дождаться завершения всех фоновых заданий, по крайней мере, до завершения сценария:источник
Если у вас есть GNU Parallel, вы бы сделали:
Одним из преимуществ является то, что выход от параллельной работы
run_commands
не будет смешиваться.источник