Warum ignoriert der CPython-Interpreter TERM, wenn er im Container ausgeführt wird?


1

Wenn ich einen Python-Prozess in einem Container mit starte

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

Und versuchen Sie dies auf einer anderen Konsole mit zu beenden

docker stop python

Der Dolmetscher wird nicht angehalten. Stattdessen muss Docker den Prozess nach einer Nachfrist abbrechen (standardmäßig 10s).

Ein einfacher

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

in der Kommandozeile kann sofort abgebrochen werden, indem ein TERM an diese gesendet wird.

Was ist der Grund für diese Asymmetrie?


Ich kenne Docker nicht, aber ich vermute, dass sein stopBefehl ein anderes Signal sendet als TERMan den Container. Edit: Hast du es versucht docker kill python? (Alternativ SIGTERM senden: docker kill --signal=SIGTERM python)
Konfetti

Siehe docs.docker.com/engine/reference/commandline/stop : „Der Hauptprozess im Container erhält SIGTERM und nach einer Nachfrist SIGKILL.“
Torsten Bronger,

Antworten:


0

Die Asymmetrie ist auf UNIX selbst zurückzuführen. Die man 2 killManpage von Linux sagt:

Die einzigen Signale, die an Prozess-ID 1, den Init-Prozess, gesendet werden können, sind solche, für die init explizit Signalhandler installiert hat. Auf diese Weise wird sichergestellt, dass das System nicht versehentlich heruntergefahren wird.

Python installiert standardmäßig keine Handler. Wenn der Python-Interpreter nicht als PID 1 ausgeführt wird, bedeutet dies, dass die Standardaktion ausgeführt wird, die für SIGTERM bedeutet, dass der Prozess abgebrochen wird. Wenn es als PID 1 ausgeführt wird, gibt es keine Standardaktion. Somit passiert nichts.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.