supervisor簡介
supervisor是一個用python語言編寫的程式管理工具,它可以很方便的監聽、啟動、停止、重啟一個或多個程式。當一個程式意外被殺死,supervisor監聽到程式死後,可以很方便的讓程式自動恢復,不再需要程式設計師或系統管理員自己編寫程式碼來控制。
supervisor 會涉及三個重要的命令
- supervisord
可以理解成supervisor的服務端
執行supervisor時會啟動一個程式supervisord,它負責啟動所管理的程式,並將所管理的程式作為自己的子程式來啟動,而且可以在所管理的程式出現崩潰時自動重啟
- supervisorctl
可以理解成supervisor的客戶端
supervisorctl是命令列管理工具,可以用如下命令來進行子程式的管理,如:
- echo_supervisord_conf
用來生成預設的配置檔案,一般生成預設檔案為 supervisor.conf
supervisor安裝的前期準備(全部使用壓縮包的方式)
supervisor是用python寫的執行在linux下的程式管理工具,安裝supervisor的時候依賴 python的一些包,它依賴:python、setuptools、meld3
1、python安裝
可以參考此處安裝python:www.cnblogs.com/wintest/p/12057170...
下載python連結:www.python.org/ftp/python/
下載相應的壓縮包,如:wget www.python.org/ftp/python/3.6.8/Py...
tar -xvf Python-3.6.8.tgz
2、setuptools安裝
下載壓縮包,用tar解壓壓縮包,安裝,如
tar -zxvf setuptools-0.6c11.tar.gz cd setuptools-0.6c11 python setup.py install
3、meld3安裝
tar -zxvf meld3-1.0.2.tar.gz cd meld3-1.0.2 python setup.py install
4、supervisor安裝
tar -zxvf supervisor-3.3.1.tar.gz cd supervisor-3.3.1 python setup.py install
此處 supervisor安裝後會生成我們關心的如下幾個可執行程式:
- supervisord 路徑
supervisord: /usr/local/bin/supervisord
- supervisorctl 路徑
supervisorctl: /usr/local/bin/supervisorctl
- echo_supervisord_conf 路徑
echo_supervisord_conf: /usr/local/bin/echo_supervisord_conf
驗證supervisor是否安裝成功
supervisorctl --help
supervisor配置
建立必要目錄和檔案
- 建立 /etc/supervisor 目錄
mkdir /etc/supervisor
- echo_supervisord_conf 生成supervisord.conf
echo_supervisord_conf > /etc/supervisor/supervisord.conf
修改/etc/supervisor/supervisord.conf檔案內容
- 將unix_http_server 下的 file 路徑改掉,如下:
[unix_http_server]
file=/var/run/supervisor.sock ; (the path to the socket file)
- 將supervisord 下的logfile 路徑 和 pidfile 路徑 改掉,如下:
[supervisorctl]
serverurl=unix:///var/run/supervisor.sock ; use a unix:// URL for a unix socket
- 將include 下的 files 路徑改掉,如下:
[include] files = conf.d/*.conf
根據上述修改的路徑,建立相應的檔案和新增許可權
建立檔案:
touch /var/run/supervisor.sock
touch /var/log/supervisord.log
touch /var/run//supervisord.pid
mkdir /etc/supervisor/conf.d
新增許可權
chmod 777 /var/run chmod 777 /var/log
編寫自己需要監控的子程式程式
子程式配置檔案的編寫
在 /etc/supervisor/conf.d 目錄下建立自己的子程式配置檔案,如:
在 /etc/supervisor/conf.d 建立檔案 test.conf
[program:test]
process_name=%(program_name)s_%(process_num)02d
command= go run main.go # 執行命令
directory=/home/qb/ # 執行檔案目錄
autostart=true # 自動啟動
autorestart=true # 自動重新啟動
user=root # 哪一個使用者執行
redirect_stderr=true #重定向錯誤
子程式的編寫
其中上述 main.go 是我臨時寫的一個demo程式,簡單迴圈1秒鐘寫入字串到檔案中(寫到檔案中是為了便於檢視效果),如:
package main
import ( "fmt" "os/exec" "time")
func main() {
for {
cmd := exec.Command("/bin/bash", "-c", `echo 222 >> a.txt`)
stdout, err := cmd.StdoutPipe()
if err != nil {
fmt.Printf("Error:can not obtain stdout pipe for command:%s\n", err)
return
}
//執行命令
if err := cmd.Start(); err != nil {
fmt.Println("Error:The command is err,", err)
return
}
fmt.Println(stdout)
time.Sleep(time.Second * time.Duration(1))
}
啟動superviosr
1、unlink一下
unlink /var/run/supervisor.sock
2、啟動supervisor:
supervisord -c /etc/supervisor/supervisord.conf
3、檢視程式執行狀態
supervisorctlstatus
檢視效果
子程式是 每間隔1秒鐘 向 a.txt檔案中寫入字串 222
進一步測試
- 刪掉子程式,測試supervisor是否會拉起子程式
將supervisor加入到開啟啟動服務中
1、寫服務檔案
vim /usr/lib/systemd/system/supervisord.service
supervisord.service
[Unit]
Description=Supervisor daemon
[Service]
Type=forking ExecStart=/usr/local/bin/supervisord -c /etc/supervisor/supervisord.conf
ExecStop=/usr/local/bin/supervisorctl shutdown
ExecReload=/usr/local/bin/supervisorctl reload
KillMode=process Restart=on-failure
RestartSec=42s
[Install]
WantedBy=multi-user.target
2、使能服務
systemctl enable supervisord
3、驗證是否使能成功
systemctl is-enabled supervisord
出現enable說明成功
4、重啟機器驗證 supervisor是否隨開機
常用命令提示
service supervisord start #啟動程式
service supervisord stop #停止程式
service supervisord status #檢視狀態
supervisorctl shutdown #關閉所有任務
supervisorctl stop|start 子程式名字 #啟動或停止服務
supervisorctl status #檢視所有任務狀態
異常情況提供參考
切記一定要把目錄名,檔名 全部寫正確,不要自己坑了自己!!
1、error: <class ‘socket.error’>, [Errno 111] Connection refused: file: /usr/lib64/python2.6/socket.py line: 567
解決方式: 使用指定配置檔案的方式處理
supervisord -c /etc/supervisor/supervisord.conf
2、初始化配置檔案 echo_supervisord_conf 報錯
解決方式:手動建立配置檔案路徑
mkdir /etc/supervisor
echo_supervisord_conf > /etc/supervisor/supervisord.conf
3、操作supervisorctl 檢視沒有test程式
解決方式:/etc/supervisor/supervisord.conf 中 開啟 include 模組
4、Unlinking stale socket /tmp/supervisor.sock
解決方式:
unlink /var/run/supervisor.sock
作者:小魔童哪吒
本作品採用《CC 協議》,轉載必須註明作者和本文連結