exec go 重啟 如何用 Go 實現熱重啟

2021-10-16 14:08:43 字數 1455 閱讀 2577

熱重啟

熱重啟(zero downtime),指新老程序無縫切換,在替換過程中可保持對 client 的服務。

原理父程序監聽重啟訊號

在收到重啟訊號後,父程序呼叫 fork ,同時傳遞 socket 描述符給子程序

子程序接收並監聽父程序傳遞的 socket 描述符

在子程序啟動成功之後,父程序停止接收新連線,同時等待舊連線處理完成(或超時)

父程序退出,熱重啟完成

實現package main

// 設定***的監聽物件(新建的或已存在的 socket 描述符)

if *graceful else

cmd := exec.command(os.args[0], args...)

cmd.stdout = os.stdout // 標準輸出

cmd.stderr = os.stderr // 錯誤輸出

cmd.extrafiles = *os.file // 檔案描述符

// 新建並執行子程序

return cmd.start()

我們在父程序執行 cmd.extrafiles = *os.file 來傳遞 socket 描述符給子程序,子程序通過執行 f := os.newfile(3, "") 來獲取該描述符。值得注意的是,子程序的 0 、1 和 2 分別預留給標準輸入、標準輸出和錯誤輸出,所以父程序傳遞的 socket 描述符在子程序的順序是從 3 開始。

測試編譯上述程式為 main ,執行 ./main -message "graceful reload" ,訪問 http://localhost:3000/test ,等待 5 秒後,我們可以看到 graceful reload 的響應。

通過執行 kill -usr2 [pid] ,我們即可進行 graceful reload 的測試。

通過執行 kill -int [pid] ,我們即可進行 graceful shutdown 的測試。

參考資料

如何用go來建立web服務

mac安裝 brew install golang 配置環境變數 vi bash profile 或 vi etc profile export goroot usr local go 安裝目錄 export gopath goroot bin 工作區 即工作目錄 可以配置多個,以 分割 expor...

Go 實現熱重啟的詳細介紹

最近在優化公司框架 trpc 時發現了乙個熱重啟相關的問題,優化之餘也總結沉澱下,對 go 如何實現熱重啟這方面的內容做乙個簡單的梳理。1.什麼是熱重啟?這是我理解的熱重啟的乙個大致描述。熱重啟現在還有沒有存在的必要?我的理解是看場景。以後臺開發為例,假如運維平台有能力在服務公升級 重啟時自動踢掉流...

如何用C 實現棧

簡單定義 棧就是一種只允許在表尾進行插入和刪除操作的線性表 舉乙個生活中的例子 我在乙個儲物箱中,堆了一堆衣服,我的一件球衣在最下面,而我要拿這件衣服,就意味著我必須將上面的衣服全部拿出來才可以,但是由於箱子只有乙個口,我也只能從上面拿東西,心裡還默默想著,當初就不該將球衣早早的放進去,導致結果就是...