網(wǎng)站首頁 編程語言 正文
容器中的應(yīng)用優(yōu)雅的退出
一、進(jìn)程的退出 - Linux
1、kill 參數(shù)
1 | SIGHUP | 啟動(dòng)被終止的程序,可讓該進(jìn)程重新讀取自己的配置文件,類似重新啟動(dòng)。 |
---|---|---|
2 | SIGINT | 相當(dāng)于用鍵盤輸入 [ctrl]-c 來中斷一個(gè)程序的進(jìn)行。 |
9 | SIGKILL | 代表強(qiáng)制中斷一個(gè)程序的進(jìn)行,如果該程序進(jìn)行到一半,那么尚未完成的部分可能會(huì)有“半產(chǎn)品”產(chǎn)生,類似 vim會(huì)有 .filename.swp 保留下來。 |
15 | SIGTERM | 以正常的方式來終止該程序。由于是正常的終止,所以后續(xù)的動(dòng)作會(huì)將他完成。不過,如果該程序已經(jīng)發(fā)生問題,就是無法使用正常的方法終止時(shí),輸入這個(gè) signal 也是沒有用的。 |
19 | SIGSTOP | 相當(dāng)于用鍵盤輸入 [ctrl]-z 來暫停一個(gè)程序的進(jìn)行。 |
2、信號(hào)
信號(hào)是一種進(jìn)程間通信的形式。一個(gè)信號(hào)就是內(nèi)核發(fā)送給進(jìn)程的一個(gè)消息,告訴進(jìn)程發(fā)生了某種事件。當(dāng)一個(gè)信號(hào)被發(fā)送給一個(gè)進(jìn)程后,進(jìn)程會(huì)立即中斷當(dāng)前的執(zhí)行流并開始執(zhí)行信號(hào)的處理程序。如果沒有為這個(gè)信號(hào)指定處理程序,就執(zhí)行默認(rèn)的處理程序。
進(jìn)程需要為自己感興趣的信號(hào)注冊(cè)處理程序,比如為了能讓程序優(yōu)雅的退出(接到退出的請(qǐng)求后能夠?qū)Y源進(jìn)行清理)一般程序都會(huì)處理 SIGTERM 信號(hào)。與 SIGTERM 信號(hào)不同,SIGKILL 信號(hào)會(huì)粗暴的結(jié)束一個(gè)進(jìn)程。因此我們的應(yīng)用應(yīng)該實(shí)現(xiàn)這樣的目錄:捕獲并處理 SIGTERM 信號(hào),從而優(yōu)雅的退出程序。如果我們失敗了,用戶就只能通過 SIGKILL 信號(hào)這一終極手段了。除了 SIGTERM 和 SIGKILL ,還有像 SIGUSR1 這樣的專門支持用戶自定義行為的信號(hào)
二、容器中的信號(hào)
-
容器的 1 號(hào)進(jìn)程為Dockerfile文件中啟動(dòng)命令進(jìn)程。
-
只有容器中的 1 號(hào)進(jìn)程能夠收到信號(hào)。
-
如果需要使用容器動(dòng)態(tài)化(即CMD命令為腳本啟動(dòng)),那么腳本進(jìn)程就為1號(hào)進(jìn)程 。
例如:/bin/bash /root/start.sh為1號(hào)進(jìn)程,應(yīng)用進(jìn)程為其他級(jí)別。
-
如果既想容器動(dòng)態(tài)化,又想優(yōu)雅退出。那么可以由DockerDameon發(fā)送信號(hào)給1號(hào)進(jìn)程,再有1號(hào)進(jìn)程發(fā)送給應(yīng)用進(jìn)程,實(shí)現(xiàn)信號(hào)的傳遞。腳本如下:
#!/bin/bash
pid=0
term_handler() {
if [ $pid -ne 0 ]; then
kill -SIGTERM "$pid"
wait "$pid"
fi
exit 143;
}
trap 'kill ${!}; term_handler' SIGTERM
啟動(dòng)命令 &
pid="$!"
while true
do
tail -f /dev/null & wait ${!}
done
原文鏈接:https://blog.csdn.net/m0_37642477/article/details/125668625
相關(guān)推薦
- 2022-12-10 C++的std::vector<bool>轉(zhuǎn)儲(chǔ)文件問題_C 語言
- 2022-10-15 Tomcat生命周期詳解_Tomcat
- 2023-04-06 C語言如何實(shí)現(xiàn)循環(huán)輸入_C 語言
- 2022-11-14 Go語言官方依賴注入工具Wire的使用教程_Golang
- 2023-01-27 解決Pycharm模塊安裝慢問題的兩種方法_python
- 2022-04-01 CentOS安裝Docker的方法_docker
- 2022-03-26 .NET?6中使用DateOnly和TimeOnly類型_ASP.NET
- 2022-08-06 pythonfor循環(huán)中range與len區(qū)別_python
- 最近更新
-
- window11 系統(tǒng)安裝 yarn
- 超詳細(xì)win安裝深度學(xué)習(xí)環(huán)境2025年最新版(
- Linux 中運(yùn)行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲(chǔ)小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎(chǔ)操作-- 運(yùn)算符,流程控制 Flo
- 1. Int 和Integer 的區(qū)別,Jav
- spring @retryable不生效的一種
- Spring Security之認(rèn)證信息的處理
- Spring Security之認(rèn)證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權(quán)
- redisson分布式鎖中waittime的設(shè)
- maven:解決release錯(cuò)誤:Artif
- restTemplate使用總結(jié)
- Spring Security之安全異常處理
- MybatisPlus優(yōu)雅實(shí)現(xiàn)加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務(wù)發(fā)現(xiàn)-Nac
- Spring Security之基于HttpR
- Redis 底層數(shù)據(jù)結(jié)構(gòu)-簡單動(dòng)態(tài)字符串(SD
- arthas操作spring被代理目標(biāo)對(duì)象命令
- Spring中的單例模式應(yīng)用詳解
- 聊聊消息隊(duì)列,發(fā)送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠(yuǎn)程分支