使用-9或-15杀死Upstart服务器,但子进程仍处于活动状态

时间:2017-07-17 12:33:55

标签: service process daemon upstart gnu-parallel

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个是孤儿。

现在,我该如何解决这个问题?我希望在崩溃时杀死服务创建的所有进程。

1 个答案:

答案 0 :(得分:0)

好吧,我能够通过post-stop解决这个问题。它是一个我认为在服务结束后执行的事件监听器。在我的例子中,如果我运行kill -9 -pid-(服务的pid),则在服务进程被终止后执行post-stop block。因此,我可以编写必要的代码来删除服务生成的所有进程。

这是我使用post-stop的代码。

post-stop script
    exec killall php & killall perl
end script