Docker没有响应终端中的CTRL + C.

时间:2015-07-10 21:10:37

标签: linux centos docker ipython-notebook

目前遇到Docker问题;我用它来运行一个启动时启动ipython笔记本的图像。我希望对ipython笔记本本身进行一些编辑,所以我需要在发布后关闭它。

然而,在终端中点击CTRL + C只输入" ^ C"作为一个字符串。似乎没有真正的方法可以使用CTRL + C来实际关闭ipython笔记本实例。

有人会有什么线索可以解决这个问题,或者知道任何解决方案吗?

5 个答案:

答案 0 :(得分:4)

这篇文章建议使用CTRL-Z作为将进程发送到后台然后通过进程ID终止进程的变通方法: Cannot kill Python script with Ctrl-C

可能出现的问题:

  • 该程序捕获ctrl-c并且什么都不做,非常不可能。

  • 有些后台进程无法正确管理。只有主进程接收信号并且子进程挂起。很可能发生了什么。

建议的解决方案:

  • 检查程序文档,了解它是如何正确启动和停止的。 ctrl-c似乎不是正确的方法。

  • 使用docker-entrypoint.sh bash脚本包装程序,该脚本阻止容器进程并能够捕获ctrl-c。这个bash示例应该有所帮助:https://rimuhosting.com/knowledgebase/linux/misc/trapping-ctrl-c-in-bash

  • 在捕获ctrl-c后,为ipython notebook调用正确的shutdown方法。

答案 1 :(得分:4)

问题是Ctrl-C向容器内的顶级进程发送信号,但该进程不一定会像您期望的那样做出反应。顶级进程在容器内部具有ID 1,这意味着它不会获得进程通常具有的默认信号处理程序。如果顶级进程是shell,那么它可以通过自己的处理程序接收信号,但不会将其转发到shell中执行的命令。细节解释为here。在这两种情况下,docker容器就像它只是忽略Ctrl-C一样。

如果您正在构建自己的图像,解决方案是运行最小的初始化过程,例如tinidumb-init,作为容器内的顶级过程。

答案 2 :(得分:0)

@ maybeg的回答已经很好地解释了为什么会发生这种情况。

关于停止无响应的容器,另一种解决方案是在另一个终端中简单地发出docker stop <container-id>。与 CTRL-C 相反,docker stop不发送SIGINT而是发送SIGTERM信号,进程可能会以不同的方式做出反应。

  

用法:docker stop [OPTIONS] CONTAINER [CONTAINER ...]

     

在宽限期后发送SIGTERM然后发送SIGKILL来停止正在运行的容器

如果失败,请使用docker kill <container-id>立即发送SIGKILL。

答案 3 :(得分:0)

在Docker留言板上的this post中:

打开一个新的shell并执行

$ docker ps # get the id of the running container
$ docker stop <container> # kill it (gracefully)

这对我来说很好。 CTRL-Z,CTRL- \等仅以字符串形式出现,但这杀死了Docker容器,并将选项卡返回到终端输入。

答案 4 :(得分:0)

您使用的容器映像很可能未正确处理过程信号。 如果您要创作图像,则按照Roland Webers的答案进行更改。 否则,请尝试使用--init运行它。

docker run -it --init ....

这为我修复了Ctrl + C。 来源:https://docs.docker.com/v17.09/engine/reference/run/#specify-an-init-process