【发布时间】:2017-07-17 12:33:54
【问题描述】:
Upstart 服务负责在 gnu-parallel 的帮助下创建一个以多个 cpu 并行运行的 gearman worker。要了解这个问题,您可以阅读我的 stackoverflow 文章,该文章描述了如何并行运行工作线程。
Fork processes indefinetly using gnu-parallel which catch individual exit errors and respawn
新贵服务: 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。
将根据 cpu 核心生成 4 个工人。例如。
___________________
Name | PID
worker 1011
worker 1012
worker 1013
worker 1014
perl 1000
perl 是运行 gnu-parallel 的进程。 而且,gnu-parallel 负责运行并行工作进程。
现在,问题来了。 如果我终止工作服务。
$ sudo kill 4620
服务有指令在被杀死后重新生成,因此它会重新启动。但是,服务创建的进程不会被杀死。这意味着它创建了一组新的流程。现在我们有 2 个 perl 和 8 个 worker。
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 的死亡并重新生成了一组新的工人。这次我们有 1 个 perl 和 8 个工人。所有8名工人都还活着。其中4个有父母,4个是孤儿。
现在,我该如何解决这个问题?我想在服务崩溃时终止服务创建的所有进程。
【问题讨论】:
标签: service process daemon upstart gnu-parallel