使用 -9 或 -15 杀死新贵服务器,但 child 进程仍然存在

Upstart server killed using -9 or -15 but child processes are still alive

Upstart 服务负责在 gnu-parallel 的帮助下创建 运行 个与 cpu 并行的 gearman worker 。要了解该问题,您可以阅读我的 Whosebug post,其中描述了如何并行 运行 worker。

新贵服务: 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 4620

4620是service workon的进程id。

4 个工人将根据 cpu 个核心生成。例如。

___________________
Name   |  PID
worker    1011
worker    1012
worker    1013
worker    1014
perl      1000

perl 是 运行ning gnu-parallel 的进程。 并且,gnu-parallel 负责 运行 个并行工作进程。

现在,问题来了。 如果我终止工作服务。

$ sudo kill 4620

该服务有指令 re-spawn 如果被终止,它会重新启动。但是,服务创建的进程不会被终止。这意味着它创建了一组新的流程。现在我们有 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

这并没有杀死工人,他们再次空手而归parent。但是,workon 服务拦截了 perl 的死亡并重生了一组新的 worker。这次我们有 1 个 perl 和 8 个工人。所有 8 名工人都还活着。其中 4 人 parent,4 人是孤儿。

现在,我该如何解决这个问题?我想在服务崩溃时终止该服务创建的所有进程。

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

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

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