docker容器中怎么捕获信号


本文小编为大家详细介绍“docker容器中怎么捕获信号”,内容详细,步骤清晰,细节处理妥当,希望这篇“docker容器中怎么捕获信号”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。信号(linux)信号是一种进程间通信的形式。一个信号就是内核发送给进程的一个消息,告诉进程发生了某种事件。当一个信号被发送给一个进程后,进程会立即中断当前的执行流并开始执行信号的处理程序。如果没有为这个信号指定处理程序,就执行默认的处理程序。
进程需要为自己感兴趣的信号注册处理程序,比如为了能让程序优雅的退出(接到退出的请求后能够对资源进行清理)一般程序都会处理 sigterm 信号。与 sigterm 信号不同,sigkill 信号会粗暴的结束一个进程。因此我们的应用应该实现这样的目录:捕获并处理 sigterm 信号,从而优雅的退出程序。如果我们失败了,用户就只能通过 sigkill 信号这一终极手段了。除了 sigterm 和 sigkill ,还有像 sigusr1 这样的专门支持用户自定义行为的信号。下面的代码简单的说明在 nodejs 中如何为一个信号注册处理程序:关于信号的更多信息,笔者在《》一文中有所提及,这里不再赘述。容器中的信号docker 的 stop 和 kill 命令都是用来向容器发送信号的。注意,只有容器中的 1 号进程能够收到信号,这一点非常关键!
stop 命令会首先发送 sigterm 信号,并等待应用优雅的结束。 香港云主机如果发现应用没有结束(用户可以指定等待的时间),就再发送一个 sigkill 信号强行结束程序。
kill 命令默认发送的是 sigkill 信号,当然你可以通过 -s 选项指定任何信号。下面我们通过一个 nodejs 应用演示信号在容器中的工作过程。创建 app.js 文件,内容如下:这个应用是一个 http 服务器,监听端口 3000,为 sigint 和 sigterm 信号注册了处理程序。接下来我们将介绍以不同的方式在容器中运行程序时信号的处理情况。应用程序作为容器中的 1 号进程创建 dockerfile 文件,把上面的应用打包到镜像中:请注意 entrypoint 指令的写法,这种写法会让 node 在容器中以 1 号进程的身份运行。接下来创建镜像:然后启动容器运行应用程序:此时 node 应用在容器中的进程号为 1:现在我们让程序退出,执行命令:此时应用会以我们期望的方式退出:应用程序不是容器中的 1 号进程创建一个启动应用程序的脚本文件 app1.sh,内容如下:然后创建 dockerfile1 文件,内容如下:接下来创建镜像:然后启动容器运行应用程序:此时 node 应用在容器中的进程号不再是 1:现在给 my-app1 发送 sigterm 信号试试,已经无法退出程序了!在这个场景中,应用程序由 bash 脚本启动,bash 作为容器中的 1 号进程收到了 sigterm 信号,但是它没有做出任何的响应动作。
我们可以通过:退出应用,它们最终都是向容器中的 1 号进程发送了 sigkill 信号。很显然这不是我们期望的,我们希望程序能够收到 sigterm 信号优雅的退出。在脚本中捕获信号创建另外一个启动应用程序的脚本文件 app2.sh,内容如下:这个脚本文件在启动应用程序的同时可以捕获发送给它的 sigterm 和 sigusr1 信号,并为它们添加了处理程序。其中 sigterm 信号的处理程序就是向我们的 node 应用程序发送 sigterm 信号。然后创建 dockerfile2 文件,内容如下:接下来创建镜像:然后启动容器运行应用程序:此时 node 应用在容器中的进程号也不是 1,但是它却可以接收到 sigterm 信号并优雅的退出了:读到这里,这篇“docker容器中怎么捕获信号”文章已经介绍完毕,想要掌握这篇文章的知识点还需要大家自己动手实践使用过才能领会,如果想了解更多相关内容的文章,欢迎关注开发云行业资讯频道。

相关推荐: msyscuione开发环境是怎样的

这篇文章主要讲解了“msyscuione开发环境是怎样的”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“msyscuione开发环境是怎样的”吧!CUI又称TUI,作为一个开发者和云主机这种服务性环境的使用者,无…

免责声明:本站发布的图片视频文字,以转载和分享为主,文章观点不代表本站立场,本站不承担相关法律责任;如果涉及侵权请联系邮箱:360163164@qq.com举报,并提供相关证据,经查实将立刻删除涉嫌侵权内容。

(0)
打赏 微信扫一扫 微信扫一扫
上一篇 11/12 21:52
下一篇 11/12 21:52

相关推荐