Почему интерпретатор CPython игнорирует TERM при запуске в контейнере?

283
Torsten Bronger

Если я запускаю процесс Python в контейнере с

docker run --name python python python3 -c "import time; time.sleep(3600)" 

И попробуйте завершить это на другой консоли с

docker stop python 

переводчик не останавливается. Вместо этого докер должен завершить процесс по истечении льготного периода (по умолчанию 10 с).

Тем не менее, простой

python3 -c "import time; time.sleep(3600)" 

в командной строке можно сразу прервать, отправив ему TERM.

В чем причина этой асимметрии?

1
Я не знаю docker, но подозреваю, что его команда `stop` посылает в контейнер другой сигнал, отличный от` TERM`. Изменить: Вы пытались `Docker убить Python`? (В качестве альтернативы для отправки SIGTERM: `docker kill --signal = SIGTERM python`) confetti 6 лет назад 0
См. Https://docs.docker.com/engine/reference/commandline/stop/: «Основной процесс внутри контейнера будет получать SIGTERM, а по истечении льготного периода - SIGKILL». Torsten Bronger 6 лет назад 0

1 ответ на вопрос

0
Torsten Bronger

Асимметрия проистекает из самой UNIX. man 2 killСправочная страница Linux гласит:

Единственные сигналы, которые могут быть отправлены в ID процесса 1, процесс init, - это сигналы, для которых init явно установил обработчики сигналов. Это сделано для того, чтобы система не была случайно отключена.

Python по умолчанию не устанавливает никаких обработчиков. Если интерпретатор Python работает не как PID 1, это означает, что выполняется действие по умолчанию, которое для SIGTERM означает прерывание процесса. Если он работает как PID 1, действие по умолчанию отсутствует. Таким образом, ничего не происходит.

Похожие вопросы