码迷,mamicode.com
首页 > 系统相关 > 详细

容器中用shell 脚本启动如何优雅关闭

时间:2020-05-22 11:24:38      阅读:167      评论:0      收藏:0      [点我收藏+]

标签:contain   默认   term   传递   kill   min   tar   获得   done   

场景1

CMD ["java", "-jar", "app.jar"]

这时候java程序的PID=1也就是容器的主进程

执行docker stop <container> 也就等于 kill -15 1,这时候只要java程序能够处理SIGTERM信号即可

场景2

CMD ["/home/default/start.sh"]

start.sh

#!/bin/bash
echo "[INFO] 开始运行"
java -jar app.jar

很多时候我们一般会用一个shell脚本作为容器的主进程,这样启动逻辑就很灵活

执行docker stop <container> 也就等于 kill -15 1,shell脚本收到SIGTERM信号后并不会把信号传给它的子进程,也就是说java程序不会做任何动作,直到宽限期到期会强制关闭容器等于kill -9

docker 使用docker stop -t 参数指定宽限期默认是10秒,kubernetes里面使用 terminationGracePeriodSeconds: 30

那么shell 如何传递SIGTERM信号给它的子进程?

#!/bin/bash
java -jar app.jar &
c_pid=$!

_kill() {
  echo "[INFO] Receive sigterm"
  kill $c_pid
  while true
  do
    check_pid=`ps -ax | awk {print $1} | grep -e "^${c_pid}$"`
    if [ ! -n "$check_pid" ]; then
echo "[INFO] Process exited" break fi sleep 1 done } trap _kill SIGTERM wait

步骤是把java程序后台启动以获得它的PID,最后一行加入wait命令防止shell退出,trap命令捕捉SIGTERM信号并执行一个命令

 

容器中用shell 脚本启动如何优雅关闭

标签:contain   默认   term   传递   kill   min   tar   获得   done   

原文地址:https://www.cnblogs.com/37yan/p/12936026.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!