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

问题描述 投票:8回答:5

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

但是,在终端中按CTRL + C只输入“^ C”作为字符串。似乎没有真正的方法使用CTRL + C来实际关闭ipython笔记本实例。

任何人都有任何线索可以导致这种情况,或者知道任何解决方案吗?

linux centos docker ipython-notebook
5个回答
5
投票

这篇文章建议将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方法。

4
投票

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

如果您正在构建自己的映像,那么解决方案是运行最小的init进程,例如tinidumb-init,作为容器内的顶级进程。


1
投票

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

docker run -it --init ....

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


0
投票

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

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

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

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

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


0
投票

来自Docker留言板上的this post

打开一个新shell并执行

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

这对我很有用。 CTRL-Z,CTRL- \等只出现在字符串中,但这会杀死Docker容器并将标签返回到终端输入。

© www.soinside.com 2019 - 2024. All rights reserved.