最新文章

从 Docker 的信号机制看容器的优雅停止

从 Docker 的信号机制看容器的优雅停止

此文是前段时间笔记的整理,之前自己对这方面的关注不够,因此做下记录。


有太多的文章介绍如何运行容器,然而如何停止容器的文章相对少很多。

根据运行的应用类型,应用的停止过程非常重要。如果应用要写文件,停止前要保证正确刷新数据并关闭文件;如果是 HTTP 服务,要确保停止前处理所有未完成的请求。

信号

信号是 Linux 内核与进程以及进程间通信的一种方式。针对每个信号进程都有个默认的动作,不过进程可以通过定义信号处理程序来覆盖默认的动作,除了 SIGSTOPSIGKILL。二者都不能被捕获或重写,前者用来将进程暂停在当前状态,而后者则是从内核层面立即杀掉进程。

有两个比较重要的进程 SIGTERMSIGKILLSIGTERM 是优雅地关闭命令,SIGKILL 则是暴力的关闭命令。比如 Docker,容器会先收到 SIGTERM 信号,10s 后会收到 SIGKILL 信号。

还有很多其他的信号,只是限定于特定的上下文。

中断

硬件的中断就像操作系统的信号。通常发生在硬件想要向操作系统注册事件时。操作系统必须立即停止运行,并处理中断。

比较常见的中断例子就是键盘中断,比如按下 ctrl+z 或者 ctrl+c。Linux 将其分别转换成 SIGTSTPSIGINT。硬件中断过去通常用来处理键盘和鼠标输入,但如今被用作操作系统软件驱动层面的信号轮训。

Docker

前面说了这么多终于来到 Docker,容器的独特之处在于通常只运行一个进程。即使是单进程,容器内 PID 为 1 的进程也具有 init 系统的特殊规则和职责。