容器中用shell 脚本启动如何优雅关闭
Posted 三木燕
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了容器中用shell 脚本启动如何优雅关闭相关的知识,希望对你有一定的参考价值。
场景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 脚本启动如何优雅关闭的主要内容,如果未能解决你的问题,请参考以下文章
从 Shell 脚本优雅地关闭 Spring Boot 应用程序