Höchstwahrscheinlich verarbeitet das von Ihnen verwendete Container-Image Prozesssignale nicht richtig. Wenn Sie das Image erstellen, ändern Sie es wie in der Antwort von Roland Webers vorgeschlagen. Versuchen Sie andernfalls, es mit --init
auszuführen .
docker run -it --init ....
Dies behebt Strg+C für mich.Quelle:https://docs.docker.com/v17.09/engine/reference/run/#specify-an-init-process
Dieser Beitrag schlägt STRG-Z als Workaround vor, um den Prozess in den Hintergrund zu schicken und den Prozess dann anhand seiner Prozess-ID zu beenden:Python-Skript kann nicht mit Strg-C beendet werden
Mögliche Probleme:
-
Das Programm fängt Strg-C ab und tut nichts, sehr unwahrscheinlich.
-
Es gibt Hintergrundprozesse, die nicht korrekt verwaltet werden. Nur der Hauptprozess empfängt das Signal und Unterprozesse hängen. Sehr wahrscheinlich, was passiert.
Vorgeschlagene Lösung:
-
Sehen Sie in der Programmdokumentation nach, wie es richtig gestartet und gestoppt wird. ctrl-c scheint nicht der richtige Weg zu sein.
-
Umschließen Sie das Programm mit einem Bash-Skript docker-entrypoint.sh, das den Containerprozess blockiert und Strg-c abfangen kann. Dieses Bash-Beispiel sollte helfen:https://rimuhosting.com/knowledgebase/linux/misc/trapping-ctrl-c-in-bash
-
Rufen Sie nach dem Fangen von Strg-C die richtige Shutdown-Methode für das Ipython-Notebook auf.
Das Problem ist, dass Strg-C ein Signal an den Prozess der obersten Ebene innerhalb des Containers sendet, aber dieser Prozess nicht unbedingt so reagiert, wie Sie es erwarten würden. Der Prozess der obersten Ebene hat die ID 1 innerhalb des Containers, was bedeutet, dass er nicht die standardmäßigen Signalhandler erhält, die Prozesse normalerweise haben. Wenn der Prozess der obersten Ebene eine Shell ist, kann er das Signal über seinen eigenen Handler empfangen, leitet es aber nicht an den Befehl weiter, der innerhalb der Shell ausgeführt wird. Details werden hier erklärt. In beiden Fällen verhält sich der Docker-Container so, als würde er Strg-C einfach ignorieren.
Wenn Sie Ihre eigenen Images erstellen, besteht die Lösung darin, einen minimalen Init-Prozess wie tini oder dumb-init als obersten Prozess innerhalb des Containers auszuführen.