天天看點

Python程式設計:supervisor子產品管理程序執行個體安裝建立一個flask項目配置啟動關閉用浏覽器來管理管理指令報錯及解決

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/

進入背景管理

Python程式設計:supervisor子產品管理程式執行個體安裝建立一個flask項目配置啟動關閉用浏覽器來管理管理指令報錯及解決

管理指令

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.html

2、報錯

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-issue

3、多指令啟動

多條指令需要使用bash來啟動

例如:

bash -c "source ~/.bash_profile && workon py3 && scrapyd"      

參考:

https://stackoverflow.com/questions/42443259/supervisorctl-always-reports-error-error-no-such-file

4、報錯

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程序管理&開機自啟
  1. supervisor 從安裝到使用
  2. 程序管理supervisor的簡單說明
  3. supervisord安裝,啟動/關閉,添加開機自啟動服務
  4. 程序管理工具supervisor的使用注意事項