Linux上命令队列的并行处理(bash、python、ruby。。。不管怎样)

2024-05-23 19:13:34 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个200个命令的列表/队列,需要在Linux服务器上的shell中运行。

我只想一次最多运行10个进程(从队列)。一些进程需要几秒钟才能完成,其他进程则需要更长的时间。

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

有人有解决这个问题的代码吗?

进一步阐述:

有200件事要做,排成一列。我一次最多要做10件事。当一根线完成一件工作时,它应该向队列询问下一件工作。如果队列中没有更多的工作,线程应该死。当所有的线都死了,就意味着所有的工作都完成了。

我试图解决的实际问题是使用imapsync将200个邮箱从旧邮件服务器同步到新邮件服务器。有些用户的邮箱很大,需要很长时间才能同步,有些用户的邮箱很小,同步速度很快。


Tags: 代码用户命令服务器列表队列进程linux
3条回答

我想您可以使用make和make-j xx命令来完成这项工作。

也许像这样的makefile

all : usera userb userc....

usera:
       imapsync usera
userb:
       imapsync userb
....

make-j 10-f生成文件

Parallel就是为了这个目的而做的。

cat userlist | parallel imapsync

与其他解决方案相比,Parallel的优点之一是它确保输出不混合。在Parallel中执行traceroute操作很好,例如:

(echo foss.org.my; echo www.debian.org; echo www.freenetproject.org) | parallel traceroute

在shell上,xargs可用于对并行命令处理进行排队。例如,如果总是有3个睡眠并行,每个睡眠1秒,总共执行10个睡眠

echo {1..10} | xargs -d ' ' -n1 -P3 sh -c 'sleep 1s' _

它总共能睡4秒钟。如果您有一个名称列表,并且希望将名称传递给执行的命令,再次并行执行3个命令,请执行

cat names | xargs -n1 -P3 process_name

将执行命令process_name aliceprocess_name bob等。

相关问题 更多 >