Ну, это все равно забавный вопрос.
Вот что я бы сделал, если предположить bash (1) конечно.
- выясните, сколько из этих команд может быть полезно одновременно запущено. Это будет не просто количество ядер; Многие команды будут приостановлены для ввода-вывода и тому подобное. Например, позвоните по этому номеру N.
N=15
.
- установить обработчик сигнала прерывания для сигнала SIGCHLD, который происходит, когда дочерний процесс завершается.
trap signalHandler SIGCHLD
- cat ваш список команд в трубу
- написать цикл, который читает stdin и выполняет команды одну за другой, уменьшая счетчик. Когда счетчик равен 0, он
wait
с.
- ваш обработчик сигнала, который работает на SIGCHLD, увеличивает этот счетчик.
Итак, теперь он запускает первые N
команды, а затем ждет. Когда первый дочерний элемент завершается, возвращается ожидание, он читает другую строку, запускает новую команду и ждет снова.
Теперь, это случай, когда многие задания заканчиваются близко друг к другу. Я подозреваю, Вы можете уйти с более простой версией:
N=15
COUNT=N
cat mycommands.sh |
while read cmd
do
eval $cmd &
if $((count-- == 0))
then
wait
fi
od
Теперь эта команда запустит первые 15 команд, а затем выполнит остальные по одной, когда какая-то команда завершится.