【问题标题】:Does runit reap orphan processes?runit 会收获孤儿进程吗?
【发布时间】:2015-07-28 06:22:49
【问题描述】:

我正在编写一个基于 Phusion baseimage 的小型 Docker 容器,它提供开箱即用的 runit。

我将 Cassandra 和 Opscenter 代理放入我的容器中。两者都作为 /etc/service 下的服务启动(如文档中所示)。

blog post 提到 my_init 会收集僵尸进程,但对于它对孤立进程的作用却含糊其辞。

这是我的 Docker 容器中ps -ef 的示例输出:

UID        PID  PPID  C STIME TTY          TIME CMD
root         1     0  0 06:05 ?        00:00:00 /usr/bin/python3 -u /sbin/my_init
root        27     1  0 06:05 ?        00:00:00 /usr/bin/runsvdir -P /etc/service
root        28    27  0 06:05 ?        00:00:00 runsv sshd
root        29    27  0 06:05 ?        00:00:00 runsv syslog-ng
root        30    27  0 06:05 ?        00:00:00 runsv cron
root        31    27  0 06:05 ?        00:00:00 runsv cassandra
root        32    27  0 06:05 ?        00:00:00 runsv syslog-forwarder
root        33    27  0 06:05 ?        00:00:00 runsv opscenter-agent
root        34    32  0 06:05 ?        00:00:00 tail -F -n 0 /var/log/syslog
root        35    30  0 06:05 ?        00:00:00 /usr/sbin/cron -f
root        36    29  0 06:05 ?        00:00:00 syslog-ng -F -p /var/run/syslog-ng.pid --no-caps
root        37    31 43 06:05 ?        00:00:10 java -ea -javaagent:/usr/share/cassandra/lib/jamm-0.3.0.jar -XX:+CMSClassUnloadingEnabled -XX:+UseThreadPriorities -XX:ThreadPrio
root        38    33  0 06:05 ?        00:00:00 /bin/bash /usr/local/opscenter/datastax-agent-5.2.0/bin/datastax-agent -f
root       471    38 51 06:05 ?        00:00:11 /usr/lib/jvm/jre1.8.0_51/bin/java -Dagent-foreground=yes -Xmx128M -Djclouds.mpu.parts.magnitude=100000 -Djclouds.mpu.parts.size=1
root       494     0  0 06:05 ?        00:00:00 bash
root       761   494  0 06:05 ?        00:00:00 ps -ef

注意runsv opscenter-agent (pid 33) 启动一个子进程,它是一个带有子进程 (pid 471) 的 bash 调用 (pid 38)。

然后我跑了sv stop opscenter-agentps -ef

UID        PID  PPID  C STIME TTY          TIME CMD
root         1     0  0 06:05 ?        00:00:00 /usr/bin/python3 -u /sbin/my_init
root        27     1  0 06:05 ?        00:00:00 /usr/bin/runsvdir -P /etc/service
root        28    27  0 06:05 ?        00:00:00 runsv sshd
root        29    27  0 06:05 ?        00:00:00 runsv syslog-ng
root        30    27  0 06:05 ?        00:00:00 runsv cron
root        31    27  0 06:05 ?        00:00:00 runsv cassandra
root        32    27  0 06:05 ?        00:00:00 runsv syslog-forwarder
root        33    27  0 06:05 ?        00:00:00 runsv opscenter-agent
root        34    32  0 06:05 ?        00:00:00 tail -F -n 0 /var/log/syslog
root        35    30  0 06:05 ?        00:00:00 /usr/sbin/cron -f
root        36    29  0 06:05 ?        00:00:00 syslog-ng -F -p /var/run/syslog-ng.pid --no-caps
root        37    31 19 06:05 ?        00:00:11 java -ea -javaagent:/usr/share/cassandra/lib/jamm-0.3.0.jar -XX:+CMSClassUnloadingEnabled -XX:+UseThreadPriorities -XX:ThreadPrio
root       471     1 20 06:05 ?        00:00:11 /usr/lib/jvm/jre1.8.0_51/bin/java -Dagent-foreground=yes -Xmx128M -Djclouds.mpu.parts.magnitude=100000 -Djclouds.mpu.parts.size=1
root       494     0  0 06:05 ?        00:00:00 bash
root       768   494  0 06:06 ?        00:00:00 ps -ef

注意 pid 38 已消失,但 pid 471 现在附加到 my_init

这是正确的行为吗?我该怎么做才能收获子进程?

【问题讨论】:

  • 我的猜测是my_init应该负责收割子进程,但不知道为什么没有。
  • 好的,this link 明确表示my_init 应该收获孤儿进程。所以我不知道我做错了什么。

标签: linux bash docker phusion runit


【解决方案1】:

my_init 采用孤立进程并收获它们。但是您误解了“收获”的含义。 my_init 没有告诉它退出; my_init等待直到它退出。您(或进程)仍有责任确保它退出。

【讨论】:

  • 谢谢,我意识到我误解了这个词。
猜你喜欢
  • 2014-01-08
  • 2014-12-06
  • 1970-01-01
  • 2011-10-12
  • 2018-03-26
  • 2020-09-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多