supervisor是一個用python語言編寫的進程管理工具,它能夠很方便的監聽、啓動、中止、重啓一個或多個進程。當一個進程意外被殺死,supervisor監聽到進程死後,能夠很方便的讓進程自動恢復,再也不須要程序員或系統管理員本身編寫代碼來控制。html
能夠理解成supervisor的服務端python
運行supervisor時會啓動一個進程supervisord,它負責啓動所管理的進程,並將所管理的進程做爲本身的子進程來啓動,並且能夠在所管理的進程出現崩潰時自動重啓linux
能夠理解成supervisor的客戶端ios
supervisorctl是命令行管理工具,能夠用以下命令來進行子進程的管理,如:程序員
用來生成默認的配置文件,通常生成默認文件爲 supervisor.confvim
supervisor安裝的前期準備(所有使用壓縮包的方式)bash
supervisor是用python寫的運行在linux下的進程管理工具,安裝supervisor的時候依賴 python的一些包,它依賴:python、setuptools、meld3socket
能夠參考此處安裝python:https://www.cnblogs.com/winte...工具
下載python連接:https://www.python.org/ftp/py...測試
下載相應的壓縮包,如:wget https://www.python.org/ftp/py...
tar -xvf Python-3.6.8.tgz
https://pypi.python.org/pypi/...
下載壓縮包,用tar解壓壓縮包,安裝,如
tar -zxvf setuptools-0.6c11.tar.gz cd setuptools-0.6c11 python setup.py install
tar -zxvf meld3-1.0.2.tar.gz cd meld3-1.0.2 python setup.py install
tar -zxvf supervisor-3.3.1.tar.gz cd supervisor-3.3.1 python setup.py install
此處 supervisor安裝後會生成咱們關心的以下幾個可執行程序:
supervisord: /usr/local/bin/supervisord
supervisorctl: /usr/local/bin/supervisorctl
echo_supervisord_conf: /usr/local/bin/echo_supervisord_conf
驗證supervisor是否安裝成功
supervisorctl --help
mkdir /etc/supervisor
echo_supervisord_conf > /etc/supervisor/supervisord.conf
修改/etc/supervisor/supervisord.conf文件內容
[unix_http_server] file=/var/run/supervisor.sock ; (the path to the socket file)
[supervisorctl] serverurl=unix:///var/run/supervisor.sock ; use a unix:// URL for a unix socket
[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)) }
unlink /var/run/supervisor.sock
supervisord -c /etc/supervisor/supervisord.conf
supervisorctlstatus
子程序是 每間隔1秒鐘 向 a.txt文件中寫入字符串 222
vim /usr/lib/systemd/system/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
systemctl enable supervisord
systemctl is-enabled supervisord
出現enable說明成功
經常使用命令提示
service supervisord start #啓動程序 service supervisord stop #中止程序 service supervisord status #查看狀態 supervisorctl shutdown #關閉全部任務 supervisorctl stop|start 子程序名字 #啓動或中止服務 supervisorctl status #查看全部任務狀態
切記必定要把目錄名,文件名 所有寫正確,不要本身坑了本身!!
解決方式: 使用指定配置文件的方式處理
supervisord -c /etc/supervisor/supervisord.conf
解決方式:手動建立配置文件路徑
mkdir /etc/supervisor echo_supervisord_conf > /etc/supervisor/supervisord.conf
解決方式:/etc/supervisor/supervisord.conf 中 打開 include 模塊
解決方式:
unlink /var/run/supervisor.sock
做者:小魔童哪吒