mla*_*bie 44 ruby python parallel-processing bash shell
我有一个200个命令的列表/队列,我需要在Linux服务器上的shell中运行.
我只希望一次最多运行10个进程(从队列中).某些流程需要几秒钟才能完成,其他流程需要更长时间.
当进程完成时,我希望从队列中"弹出"下一个命令并执行.
有没有人有代码来解决这个问题?
进一步阐述:
在某种队列中需要完成200件工作.我希望一次最多可以完成10件工作.当一个线程完成一项工作时,它应该要求队列进行下一项工作.如果队列中没有其他工作,则线程应该死掉.当所有线程都已经死亡时,意味着所有工作都已完成.
我正在尝试解决的实际问题是使用imapsync将旧邮件服务器中的200个邮箱同步到新邮件服务器.某些用户拥有大型邮箱并需要很长时间才能同步,其他用户拥有非常小的邮箱并可以快速同步.
Joh*_*itb 44
在shell上,xargs可以用来排队并行命令处理.例如,因为总是有3个并行睡眠,每个睡眠1秒,并且总共执行10次睡眠
echo {1..10} | xargs -d ' ' -n1 -P3 sh -c 'sleep 1s' _
Run Code Online (Sandbox Code Playgroud)
它总共会睡4秒钟.如果你有一个名字列表,并希望将名称传递给执行的命令,再次并行执行3个命令,那么
cat names | xargs -n1 -P3 process_name
Run Code Online (Sandbox Code Playgroud)
会执行命令process_name alice,process_name bob依此类推.
Erg*_*Sum 40
我想你可以使用make和make -j xx命令来做到这一点.
也许像这样的makefile
all : usera userb userc....
usera:
imapsync usera
userb:
imapsync userb
....
Run Code Online (Sandbox Code Playgroud)
make -j 10 -f makefile
小智 26
cat userlist | parallel imapsync
Run Code Online (Sandbox Code Playgroud)
与其他解决方案相比,Parallel的优点之一是确保输出不会混合.这样做traceroute在并行例如正常工作:
(echo foss.org.my; echo www.debian.org; echo www.freenetproject.org) | parallel traceroute
Run Code Online (Sandbox Code Playgroud)