簡體   English   中英

重擊,同時運行多個命令,等待N完成再生成更多

[英]Bash, run multiple commands simultaneously, wait for N to finish before spawning more

好吧,所以我嘗試了gnu parallel,並且有一些使它無法正常工作的怪癖。

最終,我希望能夠做這樣的事情:

for modelplot in /${rfolder}/${mplotsfolder}/${mname}/$mscript.gs
do

for regionplot in $mregions
do
opengrads -bclx "${modelplot}.gs $regionplot ${plotimage} ${date} ${run} ${gribfile} ${modelplot}" && wait -n
done

done

但是我似乎找不到一種方法來將后台進程的產生限制為特定數量。 有人提到這樣做:

for i in {1..10}; do echo "${i} & (( count ++ > 5 )) && wait -n; done

應該這樣做,但我無法真正驗證它是否以這種方式工作。 似乎只是立即將它們全部生成。 我假設終端的輸出應為:回聲1,回聲2,回聲3,回聲4,回聲5。然后回聲6,回聲7,回聲8,回聲9,回聲10。

我只是想產生一個循環的5次迭代,等待它們完成,然后產生下一個5,等待它們完成,產生下一個5,依此類推,直到循環完成。

每次啟動后台作業時,都要增加一個計數。 當該計數達到5(或其他數值)時,請wait所有后台作業完成,然后將計數重置為0並恢復開始后台作業。

p_count=0
for modelplot in /${rfolder}/${mplotsfolder}/${mname}/$mscript.gs; do
  for regionplot in $mregions; do
      opengrads -bclx "${modelplot}.gs $regionplot ${plotimage} ${date} ${run} ${gribfile} ${modelplot}" &
      if (( ++p_count == 5 )); then
          wait
          p_count=0
      fi
    done
  done
done

在Shell中將5個作業(而不是最多5個)保持在后台運行是非常棘手的。 wait -n讓你知道當一個工作已完成,但不會有多少人完成)。為了保持機器忙,像一個工具xargsparallel是比較合適的。

從您的評論中還不清楚您想要什么。

但是,使用{= =}構造可以在參數中獲得幾乎所有內容。

僅在首次運行時附加.gs:

parallel echo {}'{= if($job->seq() == 1) { $_ = ".gs" } else { $_="" } =}' ::: a b c

僅在上一次運行時附加.gs:

parallel echo {}'{= if($job->seq() == $Global::JobQueue->total_jobs() ) { $_ = ".gs" } else { $_="" } =}' ::: a b c

忽略注釋,僅查看問題中的循環,解決方案是:

parallel --header : opengrads -bclx "{modelplot}.gs {regionplot} ${plotimage} ${date} ${run} ${gribfile} {modelplot}" ::: modelplot /${rfolder}/${mplotsfolder}/${mname}/$mscript.gs ::: regionplot $mregions

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM