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
только ждет, пока он не выйдет. Вы (или процесс) по-прежнему несете ответственность за обеспечение его выхода.