目前遇到Docker问题;我用它来运行一个启动时启动ipython笔记本的图像。我希望对ipython笔记本本身进行一些编辑,所以我需要在发布后关闭它。
然而,在终端中点击CTRL + C只输入" ^ C"作为一个字符串。似乎没有真正的方法可以使用CTRL + C来实际关闭ipython笔记本实例。
有人会有什么线索可以解决这个问题,或者知道任何解决方案吗?
答案 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一样。
答案 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