Использование parallel
, как предложено в другом месте, вероятно, хорошо, но вы можете адаптировать свой код, чтобы он работал.
cwd="$PWD"
cat jobpaths.txt |
while read LINE; do
(cd "$LINE" && "$cwd/run_scrape.sh" &)
done
Конструкция (cd "$LINE" && "$cwd/run_scrape.sh" &)
запускает под-оболочку, которая изменяет каталог и запускает run_scrape.sh
скрипт из стартовой директории.Если у вас действительно есть (разные?) Сценарий run_scrape.sh
в каждом подкаталоге, то вы можете избежать переменной cwd
и продолжать использовать команду ./run_scrape.sh
.Большим преимуществом этого является то, что вам не нужно беспокоиться о смене спины;оболочка, в которой выполняется цикл, никогда не меняет каталог.
Обратите внимание, однако, что Bash будет запускать этот конвейер в подоболочках, и есть вторичная подоболочка из-за нотации (…)
.Это означает, что все задания скребка отделены от основной оболочки.Вы должны упорно трудиться, чтобы следить за их всех.Вы, вероятно, поместите &
после обозначения (…)
, чтобы вспомогательная оболочка в целом работала в фоновом режиме;оболочка с циклом while
может ждать всех потомков.Однако основной оболочке все равно не принадлежат дети.Вы можете использовать shopt -s lastpipe
, чтобы цикл while
запускался основной оболочкой, или вы можете использовать:
cwd="$PWD"
while read LINE; do
(cd "$LINE" && "$cwd/run_scrape.sh") &
done < <(cat jobpaths.txt)
, чтобы цикл while
запускался в основной оболочке и могждать всех своих детей.Возможно, вы захотите захватить PID дочерних процессов, сохраняя значения $!
в массиве в цикле.Или вы можете просто поставить wait
после цикла while
, чтобы дождаться выхода всех детей.