Upstart服务负责创建一个gearman工作人员,它在gnu并行的帮助下以cpus的数量并行运行。要理解这个问题,您可以阅读我的堆栈溢出帖子,其中描述了如何并行运行工作人员。
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好吧。所以上面的服务就开始了。
$ sudo service workon start
workon start/running, process 46204620是服务工作的进程标识。
4名工作人员将按cpu内核生成。例如。
___________________
Name | PID
worker 1011
worker 1012
worker 1013
worker 1014
perl 1000perl是运行gnu-parallel.的过程。而且,gnu-parallel负责运行并行工作进程。
现在问题是。如果我杀了工作服的话。
$ 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这并没有杀死工人,他们又一次离开了,没有任何父母。但是,workon服务拦截perl的死亡并重新生成一组新的工作人员。这一次我们有一个perl和8个工作人员。所有8名工人都还活着。其中4人有父母,4人是孤儿。
现在,我该如何解决这个问题?每当服务崩溃时,我希望杀死由它创建的所有进程。
发布于 2017-07-21 11:58:45
我通过停站解决了这个问题。我相信它是一个事件侦听器,它在服务结束后执行。在我的示例中,如果运行kill -9 -pid- (服务的pid),则在服务进程终止后执行停止后块。因此,我可以编写必要的代码来删除服务产生的所有进程。
,这是我的代码,使用的是后置.
post-stop script
exec killall php & killall perl
end scripthttps://stackoverflow.com/questions/45144436
复制相似问题