Как запустить параллельный список команд?
У меня есть файл, содержащий командные строки, которые я хочу запустить. Этот файл содержит около 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 хорошо читается, но если вы еще не читали этот учебник, я очень рекомендую инвестировать время.
Ответ 3
Вы можете запускать новые процессы на фоне, просто выполнив команду с помощью &. Ниже приведен пример описывающий решение вашей проблемы.