Supervisor是程序管理程式,能将一個普通的指令行程序變為背景daemon,并監控程序狀态,異常退出時能自動重新開機。
單純的講理論比較難懂,下面通過一個監控
flask程式的執行個體來探究
文檔:
http://supervisord.org/index.html安裝
$ pip install supervisor
建立一個flask項目
建立
server.py
作為被監控的程式
from flask import Flask
app = Flask(__name__)
@app.route('/')
def hello_world():
return 'Hello World!'
if __name__ == '__main__':
app.run()
log
檔案夾用于存放日志
配置
建立檔案夾
supervisor_demo
,用來作為工作目錄,并切換到該檔案夾下
生成配置檔案
$ echo_supervisord_conf > supervisord.conf
推薦線上使用預設路徑:
echo_supervisord_conf > /etc/supervisor/supervisord.conf
打開
supervisord.conf
檔案,在最下面找到:
;[include]
;files = relative/directory/*.ini
此處是需要監控程式的配置檔案,修改為:
[include]
files = conf/*.ini ;需手動建立conf檔案夾
建立檔案
conf/server.ini
, 并打開編輯(重點關注黑色字就行)
; 設定程序的名稱,使用 supervisorctl 來管理程序時需要使用該程序名
[program: myweb]
command=python server.py ; 添加剛剛建立的server.py檔案名
;numprocs=1 ; 預設為1
;process_name=%(program_name)s ; 預設為 %(program_name)s,即 [program:x] 中的 x
;directory=/home/python/tornado_server ; 執行 command 之前,先切換到工作目錄
;user=oxygen ; 使用 oxygen 使用者來啟動該程序
;程式崩潰時自動重新開機,重新開機次數是有限制的,預設為3次
autorestart=true
redirect_stderr=true ; 重定向輸出的日志
stdout_logfile =log/server.log ; 建立log檔案夾
loglevel=info ;日志級别
啟動
二選其一即可
$ supervisord # 不指定配置檔案啟動
$ supervisord -c supervisord.conf # 指定配置檔案路徑啟動
檢視是否啟動
ps aux | grep supervisord
log/server.log
看到已經列印出如下記錄
ps aux | grep supervisord
通路
http://127.0.0.1:5000/可以看到
Hello World!
下面試着修改下flask項目
def hello_world():
return 'New Hello World!' # 修改這裡
檢視狀态
$ supervisorctl status
myweb RUNNING pid 20266, uptime 0:05:58
我們将這個被監控的程序殺掉
kill 20266
稍等片刻,檢視log下面的日志,發現flask伺服器重新開機了
再通路下
New Hello World!
說明這個程序又被重新開機了,這就是supervisor的作用
開機啟動:
https://github.com/Supervisor/initscripts關閉
先關閉supervisor啟動腳本,之後再關閉supervisord服務
$ supervisorctl stop all
$ ps aux | grep supervisord
$ kill pid
下面是此項目的目錄結構
supervisor_demo # 項目目錄
├── conf # 需要監控程式的 配置檔案夾
│ └── server.ini # 需要監控程式的 單個配置檔案
├── log # 日志檔案夾
│ └── server.log # 自動生成的日志檔案
├── server.py # 被監控的程式
└── supervisord.conf # 配置檔案
用浏覽器來管理
打開配置檔案
supervisord.conf
, 找到如下配置項并編輯
[inet_http_server]
port=127.0.0.1:9001
username=user
password=123
更改了supervisor配置檔案,需要重新開機
$ supervisorctl reload
http://127.0.0.1:9001/ 進入背景管理
管理指令
supervisord : 啟動supervisor
supervisorctl reload :修改完配置檔案後重新啟動supervisor
supervisorctl status :檢視supervisor監管的程序狀态
supervisorctl start 程序名 :啟動XXX程序
supervisorctl stop 程序名 :停止XXX程序
supervisorctl stop all:停止全部程序,注:start、restart、stop都不會載入最新的配置檔案。
supervisorctl update:根據最新的配置檔案,啟動新配置或有改動的程序,配置沒有改動的程序不會受影響而重新開機
如果需要監控redis,可以參考:
使用 Supervisor 來管理 Redis 程序
備注:
由于 Supervisor 管理的程序不能設定為 daemon 模式,故如果 Redis 無法正常啟動,可以檢視一下 Redis 的配置,并将daemonize選項設定為 no
平滑啟動
supervisorctl reload并不像nginx -s reload是平滑啟動,而是會重新開機所有的程序
用下面的指令監測被改動的檔案,然後平滑啟動
supervisorctl reread
supervisorctl update
報錯及解決
1、報錯
error: <class 'xmlrpclib.Fault'>, <Fault 6: 'SHUTDOWN_STATE'>:
file: /usr/lib64/python2.7/xmlrpclib.py line: 794
supervisord正在執行reload,還沒有加載完成,緊接着執行supervisorctl restart XXX導緻的,已經将reload過程修改為supervisorctl reread && supervisorctl update all)
參考
https://www.cnblogs.com/lijiaocn/p/9979256.html2、報錯
error: <class 'socket.error'>, [Errno 2]
No such file or directory: file: /usr/lib64/python2.7/socket.py line: 224
上面報錯的意思是沒有啟動服務端,就是說啟動的用戶端找不到服務端位址,需要增加參數
# 啟動服務端
supervisord -c /etc/supervisor/supervisord.conf
# 啟動用戶端
supervisorctl -c /etc/supervisor/supervisord.conf
參考:
https://stackoverflow.com/questions/18859063/supervisor-socket-error-issue3、多指令啟動
多條指令需要使用bash來啟動
例如:
bash -c "source ~/.bash_profile && workon py3 && scrapyd"
參考:
https://stackoverflow.com/questions/42443259/supervisorctl-always-reports-error-error-no-such-file4、報錯
unix:///tmp/supervisor.sock no such file
原因:supervisor 預設配置會把 socket 檔案和 pid 守護程序生成在/tmp/目錄下,/tmp/目錄是緩存目錄,Linux 會根據不同情況自動删除其下面的檔案。
修改配置檔案
vim /etc/supervisor/supervisord.conf
[unix_http_server]
;file=/tmp/supervisor.sock ; (the path to the socket file)
file=/var/run/supervisor.sock ; 修改為 /var/run 目錄,避免被系統删除
[supervisord]
;logfile=/tmp/supervisord.log ; (main log file;default $CWD/supervisord.log)
logfile=/var/log/supervisor.log ; 修改為 /var/log 目錄,避免被系統删除
pidfile=/var/run/supervisord.pid ; 修改為 /var/run 目錄,避免被系統删除
...
[supervisorctl]
; 必須和'unix_http_server'裡面的設定比對
;serverurl=unix:///tmp/supervisor.sock ; use a unix:// URL for a unix socket
serverurl=unix:///var/run/supervisor.sock ; 修改為 /var/run 目錄,避免被系統删除
最後更新配置
supervisorctl update
“unix:///tmp/supervisor.sock no such file” 錯誤處理 (親測) 5、報錯
spider_admin_pro BACKOFF unknown error making dispatchers for 'spider_admin_pro': EISDIR
很多文章說,有可能是權限問題,首先看下是不是權限問題。
再看一下是不是有同名檔案
官網文檔給出的示例:
[program:cat]
command=/bin/cat
numprocs=1
directory=/tmp
stdout_logfile=/a/path
stderr_logfile=/a/path
看到
path
,我以為是一個檔案夾路徑,建立了一個同名檔案夾,然後就報錯了,
其實寫成下面的參數更直覺,需要配置一個檔案名
[program:cat]
command=/bin/cat
numprocs=1
directory=/tmp
stdout_logfile=/a/path/out.log
stderr_logfile=/a/path/err.log
參考
supervisor使用筆記centos配置開機自啟
1、建立檔案supervisord.service
#supervisord.service
[Unit]
Description=Supervisor daemon
[Service]
Type=forking
ExecStart=/usr/bin/supervisord -c /etc/supervisord.conf
ExecStop=/usr/bin/supervisorctl shutdown
ExecReload=/usr/bin/supervisorctl reload
KillMode=process
Restart=on-failure
RestartSec=42s
[Install]
WantedBy=multi-user.target
2、 将檔案拷貝到/usr/lib/systemd/system/
cp supervisord.service /usr/lib/systemd/system/
3、啟動服務
systemctl enable supervisord # 啟動服務
systemctl is-enabled supervisord # 驗證一下是否為開機啟動
Supervisor程序管理&開機自啟