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

310
Torsten Bronger

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 Kulanzzeit (standardmäßig 10 Sekunden) beenden.

Jedoch eine einfache

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

Auf der Kommandozeile kann sofort abgebrochen werden, indem ein TERM an sie gesendet wird.

Was ist der Grund für diese Asymmetrie?

1
Ich kenne Docker nicht, aber ich vermute, dass der Befehl 'stop' ein anderes Signal als 'TERM' an den Container sendet. Edit: Hast du `docker kill python` ausprobiert? (Alternativ zum Senden von SIGTERM: `docker kill --signal = SIGTERM python`) confetti vor 5 Jahren 0
Siehe https://docs.docker.com/engine/reference/commandline/stop/: „Der Hauptprozess im Container erhält SIGTERM und nach einer Übergangszeit SIGKILL.“ Torsten Bronger vor 5 Jahren 0

1 Antwort auf die Frage

0
Torsten Bronger

Die Asymmetrie stammt von UNIX selbst. Die Linux- man 2 killManpage sagt:

Die einzigen Signale, die an die Prozess-ID 1, den Init-Prozess, gesendet werden können, sind diejenigen, für die init explizit Signalhandler installiert hat. Dies geschieht, um sicherzustellen, 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. Dies bedeutet für SIGTERM, dass der Prozess abgebrochen wird. Wenn es als PID 1 ausgeführt wird, gibt es keine Standardaktion. So passiert nichts.