golang開發:環境篇(六) Go運行監控Supervisord的使用

来源:https://www.cnblogs.com/feixiangmanon/archive/2019/06/22/11067700.html
-Advertisement-
Play Games

為什麼要使用Supervisord 17年第一次寫Go項目的時候,用Go開發項目倒沒沒費多大勁,很快就開發完成了。到了在測試環境部署的時候,由於不知道有 Supervisord 這個軟體,著實花了些功夫。總不能跟開發環境一樣,直接執行編譯生成的二進位文件吧,即使 後臺執行了,萬一它掛了,沒人知道,即 ...


為什麼要使用Supervisord

17年第一次寫Go項目的時候,用Go開發項目倒沒沒費多大勁,很快就開發完成了。到了在測試環境部署的時候,由於不知道有 Supervisord 這個軟體,著實花了些功夫。總不能跟開發環境一樣,直接執行編譯生成的二進位文件吧,即使 後臺執行了,萬一它掛了,沒人知道,即使測試人員發現了,開發還得登錄到伺服器再次啟動下這個二進位文件。很明顯這個解決方案沒有任何意義,後來就在網上找解決方案。
然後,咨詢Go開發的前同事,發現了Supervisord,喜出望外。它就是最優的解決方案啊。

Supervisord 是什麼?
Supervisord 是用 Python 實現的一款非常實用的進程管理工具,supervisord 還要求管理的程式是非 daemon 程式,supervisord 會幫你把它轉成 daemon 程式,因此如果用 supervisord 來管理 nginx 的話,必須在 nginx 的配置文件里添加一行設置 daemon off 讓 nginx 以非 daemon 方式啟動。
程式崩潰或者退出Supervisord會自動啟動程式。這樣就再不也不怕go的執行文件掛掉或者退出或者死掉,Supervisord只要監控到異常狀態就會重啟執行文件並且記錄日誌。

官方的解釋
Supervisor: A Process Control System
Supervisor is a client/server system that allows its users to monitor and control a number of processes on UNIX-like operating systems.
It shares some of the same goals of programs like launchd, daemontools, and runit. Unlike some of these programs, it is not meant to be run as a substitute for init as “process id 1”. Instead it is meant to be used to control processes related to a project or a customer, and is meant to start like any other program at boot time.

它是進程式控制制系統。監控和控制 Unix系統上進程。

Supervisor 安裝

當然是在我們的虛擬機中安裝 Supervisor

sudo vagrant ssh
apt-get install supervisor

supervisorctl -h
supervisorctl -- control applications run by supervisord from the cmd line.
Usage: /usr/bin/supervisorctl [options] [action [arguments]]
Options:
-c/--configuration FILENAME -- configuration file path (default /etc/supervisord.conf)
-h/--help -- print usage message and exit
出現上面的幫助信息表示安裝成功了

安裝完成後,可以查看配置
vim /etc/supervisor/supervisord.conf
看到
[include]
files = /etc/supervisor/conf.d/*.conf
supervisord 監控的項目的配置必須部署到 /etc/supervisor/conf.d/目錄下,
並且使用conf尾碼

舉個慄子

找個簡單的Go Web的項目試試supervisor怎麼監控軟體運行的。
首先生成一個Go編譯生成的二進位可執行文件
main.go

package main

import (
    "fmt"
    "net/http"
    "log"
)

func sayhelloName(w http.ResponseWriter, r *http.Request) {
    fmt.Fprintf(w, "Hello China!")
}

func main() {
    http.HandleFunc("/", sayhelloName)
    err := http.ListenAndServe(":9090", nil)
    if err != nil {
        log.Fatal("ListenAndServe: ", err)
    }
}

編譯生成可執行文件,測試下是否訪問是否正常

go build -o test.gobin
./test.gobin
curl http://192.168.0.10:9090
Hello China!
說明Go Web是正常的

接下來我們用使用Supervisord監控這個Go web程式。
先看下Supervisord監控的軟體的配置說明
[program:項目名]
command=/data/www/go/src/test/test.bin
程式啟動命令
autostart=true
在supervisord啟動的時候也自動啟動
startsecs=10
啟動10秒後沒有異常退出,就表示進程正常啟動了,預設為1秒
autorestart=true
程式退出後自動重啟,可選值:[unexpected,true,false],預設為unexpected,表示進程意外殺死後才重啟
startretries=3
啟動失敗自動重試次數,預設是3
user=root
用哪個用戶啟動進程,預設是root
priority=999
進程啟動優先順序,預設999,值小的優先啟動
redirect_stderr=true
把stderr重定向到stdout,預設false
stdout_logfile_maxbytes=20MB
stdout 日誌文件大小,預設50MB
stdout_logfile_backups = 20
stdout 日誌文件備份數,預設是10
stdout 日誌文件,需要註意當指定目錄不存在時無法正常啟動,所以需要手動創建目錄(supervisord 會自動創建日誌文件)
stdout_logfile=/data/logs/test/test.log
日誌輸出的文件地址
stopasgroup=false
預設為false,進程被殺死時,是否向這個進程組發送stop信號,包括子進程
killasgroup=false
預設為false,向進程組發送kill信號,包括子進程

為上面我們生成 test.bin 的執行文件創建一個Supervisord監控的配置文件,配置文件必須在 /etc/supervisor/conf.d 目錄下

cd  /etc/supervisor/conf.d
vim test.conf
[program:test]
command=/data/www/go/src/test/test.bin
autostart=true
startsecs=10
autorestart=true
startretries=3
user=root
priority=999
redirect_stderr=true
stdout_logfile_maxbytes=20MB
stdout_logfile_backups = 20
stdout_logfile=/data/logs/test/test.log
stopasgroup=false
killasgroup=false

運行Supervisord,使之監控 test.gobin

添加了新的配置之後一定需要執行
supervisorctl update
會提示
test: added process group
表示test添加成功了。
查看執行狀態
supervisorctl status
test                             RUNNING   pid 4354, uptime 0:00:16

這樣表示運行成功了。
我們請求試下test.bin的服務是否正常。

curl http://192.168.0.10:9090
Hello China!
整個項目監控服務部署完成。

Supervisord 的常用命令

supervisorctl status 監控的程式的運行狀態的列表
supervisorctl stop test 停止監控的程式
supervisorctl start test 啟動監控的程式
supervisorctl restart test 重啟監控的程式
supervisorctl update 更新監控的程式,如有新的配置添加一定要先執行update

想瞭解更多,當然查看官方文檔。
http://supervisord.org/


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • HTML:HTML4.01 指的就是網頁技術HTML5:HTML4.01的升級版本 1.web的基礎知識 web與Internet1.Internet:全球性的電腦互聯網路,網際網路,互聯網,交互網2.提供服務 3.Internet上的應用程式 4.web 2.HTML快速入門 1.什麼是HTML? ...
  • 效果圖: 問題:行hover效果感覺錯亂 所以改為透明色 代碼: ...
  • 官方文檔 : https://github.com/yiminghe/async-validator ...
  • 用法 先來看看官網的介紹: 主要有八個生命周期,分別是: beforeCreate、created、beforeMount、mounted、beforeupdate、updated 、beforeDestroy和destroyed,分別對應八個不同的時期,另外還有兩個activated和deacti ...
  • 創造一個自適應的盒子,跟隨瀏覽器寬高,目的是不覆蓋body元素 css部分 html部分 js 部分生成自適應盒子 圖片元素填入盒子,點擊關閉隱藏並還原圖片 若是多張圖片可用for迴圈遍歷元素自行改造 ...
  • 作者 | huashiouhttps://segmentfault.com/a/1190000018626163 1. 概述 本文以淘寶作為例子,介紹從一百個併發到千萬級併發情況下服務端的架構的演進過程,同時列舉出每個演進階段會遇到的相關技術,讓大家對架構的演進有一個整體的認知,文章最後彙總了一些架 ...
  • 一. 本單元兩次作業的架構設計 終於在最後一個單元實現了增量式開發。在本單元第一次作業中,我便構建了圖數據結構,第二次作業變得比較簡單,無需重構,只是增加狀態圖和順序圖即可,下麵分析第二次作業的架構設計。 1. 頂級類 MyUmlGeneralInteraction 負責將輸入歸類,形成3個子Uml ...
  • 模板方法 關註公眾號 JavaStorm 獲取更多精彩。 模板方法模式在一個方法中定義了一個演算法骨架,並且 final 修飾防止子類重寫。方法中包含一些抽象方法,也就是一些步驟延遲到字類實現。模板方法使得在不改變演算法結構的情況下,重新定義演算法中的某些步驟。完整代碼可以查看GitHub: "https ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...