Запуск нескольких скриптов bash как отдельных заданий - PullRequest
0 голосов
/ 17 декабря 2018

У меня есть это:

 cat jobpaths.txt | while read LINE; do
     cd $LINE
     ./run_scrape.sh
     cd ..
     cd ..
     cd ..
     setsid
 done

Предполагается прочитать 3-уровневый подкаталог из jobpaths.txt (например, / foo / bar / foobar. Затем перейдите в этот каталог и запустите скрипт. AСценарий с тем же именем существует во всех подкаталогах, перечисленных в jobpaths.txt.

Предполагается, что cd .. умножение на 3 вернется к исходному каталогу.

setsid должен запускатьсяновый поток ЦП, прежде чем делать то же самое для всех директорий в txt.

Однако он просто запускает первое задание.

Ответы [ 2 ]

0 голосов
/ 20 декабря 2018

Использование 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, чтобы дождаться выхода всех детей.

0 голосов
/ 20 декабря 2018

Работает ли это:

cat jobpaths.txt | parallel 'cd {} && ./run_scrape.sh'

Он будет запускать по одному заданию для каждого ядра, пока все задания не будут выполнены.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...