優雅關閉服務:深入理解 SIGINT / SIGTERM 信號處理機制

目錄

為什么需要優雅關閉?

什么是 SIGINT 和 SIGTERM?

如何實現優雅關閉(以 C++ 為例)

示例代碼(gRPC 服務 + Boost 信號監聽):

優雅關閉時的清理內容通常包括:

與 SIGKILL 的區別?

總結


在構建后端服務、微服務或守護進程時,“優雅關閉(Graceful Shutdown)” 是一個經常被忽視但極其重要的實踐。本文將從原理、實際應用、最佳實踐等角度,詳細介紹優雅關閉的實現方式,尤其是如何使用 SIGINT / SIGTERM 信號來實現它。

為什么需要優雅關閉?

在實際部署中,一個服務可能隨時會被下達“關機”命令,比如:

  • 手動 Ctrl + C(開發調試時常見);

  • 使用 kill 命令終止服務;

  • 容器環境下被 Kubernetes 調用 SIGTERM 優雅終止;

  • 自動部署時滾動重啟、藍綠部署等。

如果不處理關閉邏輯,可能會發生:

  • 數據丟失(寫入尚未完成);

  • 客戶端連接被強制中斷;

  • 文件或資源句柄未釋放;

  • 線程或協程未清理,內存泄漏;

  • 日志未刷盤;

什么是 SIGINT 和 SIGTERM?

  • SIGINT中斷信號,通常是用戶按下 Ctrl + C 發出的;

  • SIGTERM終止信號,默認 kill 命令發送(非 kill -9);

  • 這些信號是可以被捕獲、處理或忽略的,適合用于執行清理操作。

如何實現優雅關閉(以 C++ 為例)

這里我們用 C++ 結合 Boost.Asio 來實現監聽信號并優雅關閉:

示例代碼(gRPC 服務 + Boost 信號監聽):

boost::asio::io_context io_context;
boost::asio::signal_set signals(io_context, SIGINT, SIGTERM);// 綁定信號處理回調
signals.async_wait([&server](const boost::system::error_code& error, int signal_number) {if (!error) {std::cout << "Received signal: " << signal_number << ". Shutting down server..." << std::endl;server->Shutdown(); // 調用 gRPC 的 Shutdown 方法優雅關閉服務}
});// 將 io_context 放入后臺線程中監聽信號
std::thread([&io_context]() {io_context.run();
}).detach();

優雅關閉時的清理內容通常包括:

項目清理操作
數據庫連接池關閉連接 / 歸還連接
文件刷新緩存并關閉句柄
日志將緩存日志寫入磁盤
gRPC/HTTP 服務器等待當前請求處理完成,優雅關閉監聽
線程池 / 協程池通知停止任務、等待處理完畢
消息隊列消費者停止訂閱、確認已處理消息
臨時文件或資源刪除、釋放鎖等

與 SIGKILL 的區別?

信號可處理?用途
SIGTERM (15)? 可攔截默認 kill 信號,推薦用于優雅終止
SIGINT (2)? 可攔截Ctrl+C,用戶觸發
SIGKILL (9)? 無法攔截強制終止,立即結束,無機會清理資源

總結

  1. signal() 或更安全的 boost::asio::signal_set 監聽信號

  2. 處理 SIGINT 和 SIGTERM,避免只處理一個

  3. 服務必須支持異步關閉機制(gRPC 的 Shutdown()、HTTP 的 stop()

  4. 保留資源清理接口(連接池、日志等)

  5. 結合主線程 wait() 和后臺信號監聽線程工作

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/78106.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/78106.shtml
英文地址,請注明出處:http://en.pswp.cn/web/78106.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

容器化-Docker-集群

一、Docker 集群基礎概念? 1、什么是 Docker 集群? Docker 集群是由多個 Docker 主機組成的集合,這些主機通過網絡連接在一起,共同管理和運行容器。在集群中,我們可以將容器服務均勻地分布到各個節點上,實現負載均衡和資源的高效利用。Docker 集群的核心組件包括管理器…

關于kafka

1.為什么需要消息隊列 舉個經典的例子。 你是一個網購達人&#xff0c;經常在網上購物。快遞小哥到了你的小區后&#xff0c;立刻給你打電話說&#xff1a;“你的快遞到了&#xff0c;請馬上來取。” 但你是一個合格的牛馬&#xff0c;在上班&#xff0c;不方便取快遞&#…

微服務即時通信系統(十二)---入口網關子服務

目錄 功能設計 模塊劃分 業務接口/功能示意圖 服務實現流程 網關HTTP接口 網關WebSocket接口 總體流程 服務代碼實現 客戶端長連接管理封裝(connectionManage.hpp) proto文件的編寫 身份鑒權proto 事件通知proto 各項請求的URL的確定 服務端完成入口網關服務類…

存儲器層次結構:理解計算機記憶的金字塔

存儲器層次結構&#xff1a;理解計算機記憶的金字塔 在計算機系統中&#xff0c;“速度”與“成本”常常處于對立面。為了在速度與成本之間取得平衡&#xff0c;計算機體系結構采用了一種名為“存儲器層次結構&#xff08;Memory Hierarchy&#xff09;”的設計思想。本文將通…

HTTP 錯誤 500.19 - Internal Server Error

1.HTTP 錯誤 500.19 - Internal Server Error NetCore項目托管到IIS后&#xff0c;報錯如下&#xff1a; 原因是因為IIS中沒有安裝AspNetCoreModuleV2導致的&#xff0c; 1.打開IIS 2.選中服務器根節點&#xff0c;找到模塊&#xff0c;雙擊進入&#xff0c;確認模塊中是否存…

【c++】【STL】stack詳解

目錄 stack類的作用什么是容器適配器stack的接口構造函數emptysizetoppushpopswap關系運算符重載 stack類的實現 stack類的作用 stack是stl庫提供的一種容器適配器&#xff0c;也就是我們數據結構中學到的棧&#xff0c;是非常常用的數據結構&#xff0c;特點是遵循LIFO&#…

K8s學習與實踐

一、Kubernetes 核心原理 1. Kubernetes 設計哲學 Kubernetes&#xff08;k8s&#xff09;是一個開源的容器編排平臺&#xff0c;旨在自動化容器化應用的部署、擴展和管理。其核心設計圍繞以下目標&#xff1a; 聲明式配置&#xff1a;用戶描述期望狀態&#xff08;如 YAML …

Umi-OCR項目(1)

最近接觸到了一個項目&#xff0c;我在想能不能做出點東西出來。 目標&#xff1a;識別一張帶表格的圖片&#xff0c;要求非表格內容和表格內容都要識別得很好&#xff0c;并且可視化輸出為word文檔。 下面是第一步的測試代碼&#xff0c;測試是否能夠調用ocr能力。 import re…

Mioty|采用報文分割(Telegram Splitting)以提高抗干擾能力的無線通信技術【無線通信小百科】

1、什么是Mioty 在物聯網&#xff08;IoT&#xff09;快速發展的背景下&#xff0c;低功耗廣域網&#xff08;LPWAN&#xff09;技術成為連接海量設備的關鍵。LPWAN具有低功耗、低成本、廣覆蓋和強抗干擾能力等特點&#xff0c;使其特別適用于大規模、遠距離、低數據速率的IoT…

TCP三次握手、四次揮手+多線程并發處理

目錄 一、三次握手建立連接 1.1 標記位 1.2 三次握手的過程 二、四次揮手斷開連接 三、模擬服務器和客戶端收發數據 四、多線程并發處理 五、TCP粘包問題 5.1 什么是TCP粘包&#xff1f; 5.2 TCP粘包會有什么問題&#xff1f; 5.3 TCP粘包的解決方法&#xff1f; 一、三…

使用HunyuanVideo搭建文本生視頻大模型

1.摘要 HunyuanVideo是一個全新的開源視頻基礎模型&#xff0c;其視頻生成性能堪比領先的閉源模型&#xff0c;甚至超越它們。我們采用了多項模型學習的關鍵技術&#xff0c;通過有效的模型架構和數據集擴展策略&#xff0c;我們成功訓練了一個擁有超過 130 億個參數的視頻生成…

LabVIEW圓錐滾子視覺檢測系統

基于LabVIEW平臺的視覺檢測系統提高圓錐滾子內組件的生產質量和效率。通過集成高分辨率攝像頭和先進的圖像處理算法&#xff0c;系統能夠自動識別和分類產品缺陷&#xff0c;從而減少人工檢查需求&#xff0c;提高檢測的準確性和速度。 ?? ? 項目背景 隨著制造業對產品質…

mac 基于Docker安裝minio服務器

在 macOS 上基于 Docker 安裝 MinIO 是一個高效且靈活的方案&#xff0c;尤其適合本地開發或測試環境。以下是詳細的安裝與配置步驟&#xff0c;結合了最佳實踐和常見問題的解決方案&#xff1a; 一、安裝 Docker Desktop 下載安裝包 訪問 Docker 官網&#xff0c;下載適用于 …

EchoMimicV2 部署記錄

在這里插入代碼片# 虛擬環境配置 pip install pip -U pip install torch2.5.1 torchvision0.20.1 torchaudio2.5.1 xformers0.0.28.post3 --index-url https://download.pytorch.org/whl/cu124 pip install torchao --index-url https://download.pytorch.org/whl/nightly/cu1…

數據升降級:醫療數據的“時空穿梭“系統工程(分析與架構篇)

一、核心挑戰與量化分析 1. 版本演化困境的深度解析 (1) 格式斷層的結構化危機 數據轉換黑洞:某醫療信息平臺(2021-2023)統計顯示: 數據類型CDA R1→R2轉換失敗率R2→FHIR轉換失敗率關鍵失敗點診斷記錄28.4%19.7%ICD編碼版本沖突(18.7%)用藥記錄15.2%12.3%劑量單位標準化…

個人開發免費好用

聊一聊 現在輸入法非常多&#xff0c;有時候都不知道哪個更好用。 其實&#xff0c;只有多嘗試&#xff0c;才能找到適合自己的。 今天給大家分享一款輸入法&#xff0c;用起來比較順手&#xff0c;大家可以試試。 軟件介紹 BL輸入法 這是一款綠色純凈&#xff0c;安全放心…

Windows查看和修改IP,IP互相ping通

Windows系統 查看IP地址 winr 輸入cmd 打開終端使用 ipconfig 或 ipconfig -all 命令查看當前網絡 IPV4地址 Windows系統 修改IP地址 自動獲取IP&#xff08;DHCP&#xff09;&#xff1a; 打開 控制面板&#xff0c;點擊 網絡和Internet。點擊 網絡和共享中心。選擇 更改適配…

【IP101】圖像處理基礎:從零開始學習顏色操作(RGB、灰度化、二值化、HSV變換)

&#x1f3a8; 顏色操作詳解 &#x1f31f; 在圖像處理的世界里&#xff0c;顏色操作就像是一個魔術師的基本功。今天&#xff0c;讓我們一起來解鎖這些有趣又實用的"魔法"吧&#xff01; &#x1f4da; 目錄 通道替換 - RGB與BGR的"調包"游戲灰度化 - 讓…

windows系統搭建自己的ftp服務器,保姆級教程(用戶驗證+無驗證)

前言 最近在搭建環境時&#xff0c;我發現每次都需要在網上下載依賴包和軟件&#xff0c;這不僅耗時&#xff0c;而且有時還會遇到網絡不穩定的問題&#xff0c;導致下載速度慢或者中斷&#xff0c;實在不太方便。于是&#xff0c;我產生了搭建一個FTP服務器的想法。通過搭建FT…

藍橋杯 7. 晚會節目單

晚會節目單 原題目鏈接 題目描述 小明要組織一臺晚會&#xff0c;總共準備了 n 個節目。然而晚會時間有限&#xff0c;他只能從中選擇 m 個節目。 這 n 個節目是按照小明設想的順序給定的&#xff0c;順序不能改變。 小明發現觀眾對于晚會的喜歡程度與前幾個節目的好看程度…