乾淨利落地升級正在運行的agent程序。適用於Devops團隊。html
目標:nginx
不關閉現有鏈接:例如咱們不但願關掉已部署的運行中的程序。但又想不受限制地隨時升級服務。git
新的進程要可以啓動並替換掉舊的。github
原理:golang
在基於Unix的操做系統中,signal(信號)是與長時間運行的進程交互的經常使用方法.web
SIGTERM: 優雅地中止進程apache
SIGHUP: 重啓/從新加載進程 (例如: nginx, sshd, apache)centos
若是收到SIGHUP信號,優雅地重啓進程須要如下幾個步驟:服務器
服務器要拒絕新的鏈接請求,但要保持已有的鏈接。ssh
啓用新版本的進程
將socket「交給」新進程,新進程開始接受新鏈接請求
舊進程處理完畢後當即中止。
實現參考:
https://grisha.org/blog/2014/06/03/graceful-restart-in-golang/ beego的grace模塊主要的思路來源也是參考這篇文章
https://www.oschina.net/translate/graceful-server-restart-with-go
https://scalingo.com/articles/2014/12/19/graceful-server-restart-with-go.html
https://github.com/tim1020/godaemon
https://tomaz.lovrec.eu/posts/graceful-server-restart/ 優雅的從新啓動Golang web 服務
https://zhuanlan.zhihu.com/p/59196185
一、實現後的agent程序,通常都是註冊在systemd中(centos 7),咱們準備的xxx.service文件須要指明PIDFile,這樣在進行kill -HUP <server pid>時不會致使因systemd探測產生進程啓動失敗。
二、程序自支持kill -HUP,能夠在代碼中實現,經過這個方式這樣能夠經過控制檯端隨意的升級哪臺agent。
升級步驟: