для быстрого исправления, не используйте spawn
метод запуска и / или не используйте su -c ...
, оба являются ненужными IMO.измените на:
p = mp.Process(target=do_smth, args=tuple())
или вы можете запустить контейнер с опцией --init
.
с spawn
методом запуска, Python также запустит семафорный трекер чтобы предотвратить утечку семафора, вы можете увидеть этот процесс, сделав паузу mp.py
в середине, он выглядит следующим образом:
472 463 /usr/local/bin/python3 -c from multiprocessing.semaphore_tracker import main;main(3)
этот процесс запущен mp.py
, но завершен после mp.py
, таким образом, он будетне должен быть получен mp.py
, но должен быть получен init
по проекту.
проблема в том, что в этом контейнере (пространстве имен) нет init
вместо init
, PID1 - su -c
, поэтому процесс отслеживания мертвого семафора принимается su
.
. Похоже, что su
считает, что мертвый дочерний процесс является ошибочным процессом команды (forever.py
), без проверкиотношения, поэтому su
выходят вслепую, так как при выходе из PID 1 ядро убивает все другие процессы в контейнере, включая forever.py
.
, такое поведение можно наблюдать при strace
:
docker run --security-opt seccomp:unconfined --rm -it ex_bug strace -e trace=process -f su -c 'python3 forever.py'
выведет сообщение об ошибке, например:
strace: Exit of unknown pid 14 ignored
ref: Проблема с Docker и PID 1 зомби (phusion.nl)