Как запустить параллельный список команд?

У меня есть файл, содержащий командные строки, которые я хочу запустить. Этот файл содержит около 2000 строк.

У меня есть 8 ядер. Можно ли проанализировать файл и запустить 8 процессов, а затем выполнить другой из файла, когда заканчивается одна из программ? Я хочу, чтобы это продолжалось до тех пор, пока не будет достигнут конец файла.

Ответ 1

Вы можете использовать xargs для чтения в файле, ограничивая максимальное количество процессов количеством доступных ядер. Например:

cores=$(fgrep -c processor /proc/cpuinfo)
xargs --arg-file=/tmp/foo \
      --max-procs=$cores  \
      --replace \
      --verbose \
      /bin/sh -c "{}"

Ответ 2

Использовать GNU-параллель. Это невероятно мощный инструмент и официальные пакеты существуют около 20 или около того Linux-дистрибутивов. Что это? У вас есть предлог, почему вы не можете его использовать? Вот простой пример, показывающий, как параллельно запускать список или файл команд:

Содержание jobs.txt:

sleep 1; echo "a"
sleep 3; echo "b"
sleep 2; echo "c"

Команда:

time parallel :::: jobs.txt

Результаты:

a
c
b

real    0m3.332s
user    0m0.170s
sys     0m0.037s

Примечания:

Если вы хотите сохранить порядок так же, как и вход, передайте флаг -k на параллельный GNU.

Если у вас более восьми ядер и требуется только обработать восемь ядер, добавьте -j 8 в список аргументов.

Страница man хорошо читается, но если вы еще не читали этот учебник, я очень рекомендую инвестировать время.