使用 -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
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