Upstart服务负责创建一个在 gnu-parallel 的帮助下以cpus的数量并行运行的齿轮工作者。要了解这个问题,您可以阅读我的 stackoverflow 帖子,该帖子介绍了如何并行运行worker。
Fork processes indefinetly using gnu-parallel which catch individual exit errors and respawn
Upstart服务: workon.conf
# workon
description "worker load"
start on runlevel [2345]
stop on runlevel [!2345]
respawn
script
exec seq 1000000 | parallel -N0 --joblog out.log ./worker
end script
Oright。所以以上服务开始
$ sudo service workon start
workon start/running, process 4620
4620
是服务工作的进程ID。
将按照cpu核心生成4个工作人员。例如。
___________________
Name | PID
worker 1011
worker 1012
worker 1013
worker 1014
perl 1000
perl是运行 gnu-parallel 的过程。 并且, gnu-parallel 负责运行并行工作进程。
现在,问题是。 如果我杀了workon服务。
$ sudo kill 4620
该服务具有重新生成的指令,如果被杀死则重新启动。但是,服务创建的进程不会被杀死。这意味着它创建了一组新的流程。现在我们有2个perl和8个工人。
Name | PID
worker 1011
worker 1012
worker 1013
worker 1014
worker 2011
worker 2012
worker 2013
worker 2014
perl 1000
perl 2000
如果你问我,通过服务放弃的旧过程,他们是僵尸吗? 嗯,答案是否定的。他们还活着,因为我测试了它们。每次服务终止时,它都会创建一个新的集合。
嗯,这是一个问题。另一个问题是 gnu-parallel 。 让我们说我开始服务是新鲜的。服务运行良好。 我运行此命令来杀死 gnu-parallel ,即perl
$ sudo kill 1000
这不会杀死工人,他们再次离开没有任何父母。但是,工作服务拦截了perl的死亡,并重新生成了一组新的工人。这次我们有1个perl和8个工人。所有8名工人都活着。其中4个是父母,4个是孤儿。
现在,我该如何解决这个问题?我希望在崩溃时杀死服务创建的所有进程。
答案 0 :(得分:0)
好吧,我能够通过post-stop解决这个问题。它是一个我认为在服务结束后执行的事件监听器。在我的例子中,如果我运行kill -9 -pid-
(服务的pid),则在服务进程被终止后执行post-stop block。因此,我可以编写必要的代码来删除服务生成的所有进程。
这是我使用post-stop的代码。
post-stop script
exec killall php & killall perl
end script