Runit пожинает сиротские процессы?

Я пишу небольшой Docker-контейнер, основанный на базовом изображении Phusion, который предоставляет runit из коробки.

Я положил Кассандру и агента Opscenter в свой контейнер. Оба запускаются как сервис в /etc/service (как в doc).

В этом посте упоминается, что my_init будет собирать процессы зомби, но неясно, что он делает с процессами-сиротами.

Вот пример вывода ps -ef в моем контейнере Docker:

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) запускает дочерний процесс, который является вызовом bash (pid 38), с дочерним процессом (pid 471).

Потом я побежал sv stop opscenter-agent, а также 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 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,

Это правильное поведение? Что я должен сделать, чтобы пожинать дочерний процесс?

1 ответ

Решение

my_init принимает осиротевшие процессы и пожинает их. Но вы не поняли, что значит "пожинать". my_init не говорит ему выйти; my_init только ждет, пока он не выйдет. Вы (или процесс) по-прежнему несете ответственность за обеспечение его выхода.

Другие вопросы по тегам