如何优雅地分离无限睡眠泊坞窗以及为啥
Posted
技术标签:
【中文标题】如何优雅地分离无限睡眠泊坞窗以及为啥【英文标题】:how to detach a infinite sleep docker gracefully and why如何优雅地分离无限睡眠泊坞窗以及为什么 【发布时间】:2019-10-14 14:54:29 【问题描述】:1) 我运行以下命令来启动一个容器:
docker run -d ubuntu /bin/bash -c 'while true; do echo hello world; sleep 1; done;'
2) 我使用以下命令附加到它。
docker attach xxxx
3) 我无法使用ctrl +c
或ctrl +p
ctrl+q
序列将其分离。
我想知道如何退出它以及为什么ctrl + c
不起作用。谢谢。
【问题讨论】:
【参考方案1】:bash 脚本是容器中的主进程,它有PID 1
。正如docs 中所述,PID 1
的进程与其他进程的处理方式不同:
在容器内以 PID 1 运行的进程会被特殊处理 Linux:它使用默认操作忽略任何信号。所以,过程 不会在 SIGINT 或 SIGTERM 上终止,除非它被编码这样做。
这意味着脚本应该捕获信号并对其进行处理。让它退出声明一个trap
:
docker run -d ubuntu /bin/bash -c 'trap exit INT TERM; while true; do echo hello world; sleep 1; done;'
请记住,在前台进程终止之前,bash 不会处理任何信号(在本例中为 sleep
)。因此会有延迟,具体取决于睡眠间隔和您按下CTRL+C
的时间。
要立即退出,sleep
应该是可中断的(参见sleep, wait and Ctrl+C propagation):
docker run -d ubuntu /bin/bash -c 'trap exit INT TERM; while true; do echo hello world; sleep 1 & wait; done;'
容器使用-d
标志运行。除非您使用 -it
运行它,否则您无法分离。
如果容器使用 -i 和 -t 运行,您可以从 容器并使用 CTRL-p CTRL-q 键序列使其运行
.
【讨论】:
以上是关于如何优雅地分离无限睡眠泊坞窗以及为啥的主要内容,如果未能解决你的问题,请参考以下文章
为啥C没有像javascript中的setTimeout这样的非阻塞睡眠功能
sh [下载并设置HDF 3.0泊坞窗容器]使用此脚本下载并设置HDF泊坞窗容器#hdf #docker #setup#hdf30