使用多个进程排队以启动bash作业

时间:2015-05-30 08:12:11

标签: bash shell parallel-processing queue

我需要在shell中运行很多(数百个)命令,但我只希望一次最多有4个进程(从队列中)运行。每个过程都会持续几个小时。

当进程完成时,我希望从队列中“弹出”下一个命令并执行。

我还希望能够在开始之后添加更多进程,如果我可以从队列中删除一些作业,或者至少清空队列,那将会很棒。

我已经看过使用makefile的解决方案,但这只有在我开始之前拥有所有命令列表时才有效。还尝试使用mkfifo sjobq和其他人,但我从来没有达到我的需求......

有没有人有代码来解决这个问题?

编辑:回应Mark Setchell

尾部-f和并行的解决方案几乎是完美的,但是当我这样做时,它始终不会启动最后4个命令,直到我添加更多,依此类推,我不知道为什么,它是相当的麻烦...

至于Redis,也是一个很好的解决方案,但掌握所有这些都需要更多的时间。

谢谢!

1 个答案:

答案 0 :(得分:0)

使用GNU Parallel创建这样的作业队列:

# Clear out file containing job queue
> jobqueue        

# Start GNU Parallel processing jobs from queue
#   -k   means "keep" output in order
#   -j 4 means run 4 jobs at a time
tail -f jobqueue | parallel -k -j 4

# From another terminal, submit 40 jobs to the queue
for i in {1..40}; do echo "sleep 5;date +'%H:%M:%S Job $i'"; done >> jobqueue

另一个选择是使用REDIS - 请参阅我的答案Run several jobs parallelly and Efficiently