我有这个:
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中的所有目录执行相同的操作。
但是它只是启动了第一份工作。
答案 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
,以等待所有子项退出。