从Gearman作业服务器中删除所有Gearman作业

14

有没有一种方法可以从Gearman作业服务器中删除所有Gearman作业?我的PHP应用程序在后台运行Gearman作业。对于我的单元测试,我需要确保a)没有等待执行它的工作人员的作业,b)没有工作人员在工作。后者并不那么重要,因为可以轻松地杀死工作人员,但前者 - 我不知道如何实现。

有没有一种方法可以从Gearman作业服务器中删除所有Gearman作业?我的PHP应用程序在后台运行Gearman作业。对于我的单元测试,我需要确保a)没有等待执行它的工作人员的作业,b)没有工作人员在工作。后者并不那么重要,因为可以轻松地杀死工作人员,但前者 - 我不知道如何实现。

5
非常感谢,我们已经有足够的失业人员了!</强制性的德国工匠笑话> - Pekka
难道模拟 Gearman 服务,而不是依赖于一个真正的物理服务器运行,会更有意义吗? - Gordon
是的,我也在做那个。但除了主要应用程序外,还有通过HTTP执行的小脚本,非常轻巧且没有包含任何东西。它们仅调用GearmanClient以在后台运行作业,然后就消失了。我正在使用cURL测试它们。 - stofl
2个回答

33

删除所有相同类型的作业

使用以下命令(只需替换FUNCTION_NAME):

gearman -n -w -f FUNCTION_NAME > /dev/null

为了仅删除n个工作,添加-c n参数,例如,要删除20个工作:

gearman -c 20 -n -w -f FUNCTION_NAME > /dev/null

从服务器中删除所有作业

如果您想要删除所有作业,请运行以下循环:

for MATCH in $(echo status | nc 127.0.0.1 4730 | grep -v \\. |  grep -Pv '^[^\t]+\t0\t' | cut -s -f 1-2 --output-delimiter=\,); 
do 
    gearman -n -w -f ${MATCH%\,*} -c ${MATCH#*\,} > /dev/null;
done

127.0.0.1 4730替换为您自己的gearmand服务器地址和端口。

注:从持久性存储(如sqlite)中删除作业不会在gearmand重新启动之前将它们从gearmand中删除(因为gearmand进程具有内存缓存)。


谢谢。是否也可以删除所有作业(FUNCTION_NAME = *)? - stofl
给你。添加了一个删除所有作业的配方。 - Artur Bodera
这个 shell 脚本对我不起作用。第二个似乎过滤掉了所有东西。但是我确实需要在 php 测试用例中使用它,我会在那里编写一个脚本来获取所有作业并启动一些进程来消耗所有这些作业。谢谢! - stofl
@ArturBodera,是否可以从远程服务器删除作业?(调用gearman -n -w -f $ {MATCH%\,*} -c $ {MATCH#*\,} > / dev / null;)在其他IP上? - Eyal Ch
当然,只需使用“-h”表示远程主机,“-p”表示端口。更多信息请参见文档 - Artur Bodera

0
使用持久队列非常简单,只需截断队列表即可。

默认情况下,工作是如何存储的?我认为是在内存中,对吗? - stofl
在内存中,我认为是这样的。以老派的方式,您可以重新启动Gearman服务。通过谷歌搜索,我找不到更好的解决方案,也没有在Gearman网站上找到。您正在使用Gearman处理哪些类型的进程?也许您可以实现持久队列并与它们一起工作。 - Rafael Kassner
1
除非在截断表后重新启动gearmand,否则这将无法正常工作。 - Tony

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接