将多个bash脚本作为单独的作业启动

时间:2018-12-16 21:50:38

标签: linux bash unix

我有这个:

BackgroundWorker

应该从jobpaths.txt中读取一个3级子目录(例如/ foo / bar / foobar。然后使用cd进入该目录并启动脚本。此名称的脚本存在于jobpaths中列出的所有子目录中。 txt。

cat jobpaths.txt | while read LINE; do cd $LINE ./run_scrape.sh cd .. cd .. cd .. setsid done 乘以3应该回到初始目录。

cd ..应该先启动一个新的cpu线程,然后再对txt中的所有目录执行相同的操作。

但是它只是启动了第一份工作。

2 个答案:

答案 0 :(得分:3)

这项工作:

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

它将在每个核心上运行一个作业,直到完成所有作业为止。

答案 1 :(得分:1)

按照其他地方的建议使用parallel可能很好,但是您可以修改代码以使其起作用。

cwd="$PWD"
cat jobpaths.txt |
while read LINE; do
     (cd "$LINE" && "$cwd/run_scrape.sh" &)
done

(cd "$LINE" && "$cwd/run_scrape.sh" &)构造运行一个子Shell,该子Shell更改目录并从起始目录运行run_scrape.sh脚本。如果每个子目录中确实有一个(不同的)run_scrape.sh脚本,则可以避免使用cwd变量并继续使用./run_scrape.sh命令。这样做的最大好处是您不必担心变回原样。运行循环的外壳程序永不更改目录。

但是,请注意,Bash将在子Shell中运行该管道,并且由于(…)表示法而存在第二个子Shell。这意味着刮板作业均与主外壳分开。您必须努力工作才能跟踪所有信息。您可能会将&放在(…)表示法之后,以便整个子shell在后台运行;然后,运行while循环的shell可以等待所有子级。但是,主外壳仍然不会拥有这些子级。您可以使用shopt -s lastpipe来使while循环由主shell运行,或者可以使用:

cwd="$PWD"
while read LINE; do
     (cd "$LINE" && "$cwd/run_scrape.sh") &
done < <(cat jobpaths.txt)

,以便while循环在主外壳中运行,它可以等待其所有子代。您可能需要通过将$!值存储在循环中的数组中来捕获子进程的PID。或者,您可能只是在wait循环之后放置while,以等待所有子项退出。