runit收获孤立进程吗?

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

我把Cassandra和Opscenter的代理放在我的容器里。 两者都是以/ etc / service下的服务启动(如doc)。

这个博客文章提到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)启动一个包含subprocess(pid 471)的bash调用(pid 38)的subprocess。

然后我跑了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采用孤立的进程并收获它们。 但是你误解了“收获”的含义。 my_init不会告诉它退出; my_init只等到它退出。 您(或过程)仍然负责确保退出。