我总共要从Shell脚本运行n个命令,其中x应该在任何给定时间运行。直到现在我有:
command 1 &
command 2 &
..
..
command x &
wait
虽然上面的代码确保一次只运行x个命令,但它会一直等到第一个x命令完成后产生下一个x。我希望下一个命令在这些x中的任何一个完成后立即执行。我怎样才能做到这一点?
另外,这可以通过在Python中编写脚本来实现吗?
答案 0 :(得分:1)
我建议使用xargs -P $ x。我经常使用xargs来保持给定系统上的所有内核运行,或者确保我的cpu在时间关键应用程序中饱和
答案 1 :(得分:1)
更新了答案
现在您已经提供了有关您实际需求的更多信息,我建议您在失败的被叫sites.txt
中抓取您希望抓取的所有网站的名称,每行一个,如下所示:
www.google.com
www.hp.com
www.ibm.com
然后你可以像这样运行GNU Parallel
:
parallel -j n -a sites.txt scrapy crawl
如果要将输出定向到每个命令的单独文件,如果命令支持-o <outputfile>
选项,则可以使用如下语法:
parallel -j n -a sites.txt scrape crawl {} -o {}.json
和parallel
将替换它看到{}
的网站名称,以便生成输出文件
www.google.com.json
等等。
原始答案
使用GNU Parallel
。通常,如果您希望n
个作业正在运行,请使用
parallel -j n command
在不知道如何生成参数的情况下,很难进一步建议,除非参数可以来自文件(如果使用-a file
),或者如果它们本质上是文件名,则可以将它们之后用三重冒号分隔
parallel -j n command ::: *.jpg