【问题标题】:Upstart server killed using -9 or -15 but child processes are still alive使用 -9 或 -15 杀死的新贵服务器,但子进程仍然存在
【发布时间】: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


    【解决方案1】:

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-12-02
      • 1970-01-01
      • 2012-08-07
      相关资源
      最近更新 更多