我需要在shell中运行很多(数百个)命令,但我只希望一次最多有4个进程(从队列中)运行。每个过程都会持续几个小时。
当进程完成时,我希望从队列中“弹出”下一个命令并执行。
我还希望能够在开始之后添加更多进程,如果我可以从队列中删除一些作业,或者至少清空队列,那将会很棒。
我已经看过使用makefile的解决方案,但这只有在我开始之前拥有所有命令列表时才有效。还尝试使用mkfifo sjobq和其他人,但我从来没有达到我的需求......
有没有人有代码来解决这个问题?
编辑:回应Mark Setchell
尾部-f和并行的解决方案几乎是完美的,但是当我这样做时,它始终不会启动最后4个命令,直到我添加更多,依此类推,我不知道为什么,它是相当的麻烦...
至于Redis,也是一个很好的解决方案,但掌握所有这些都需要更多的时间。
谢谢!
答案 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