使用supervisor支持Python3程序 (解決找不到Module的問題)


Supervisor是python2寫就的一款強大的運維工具(其實現在已經支持Python3了 https://github.com/Supervisor/supervisor
那么怎么利用Supervisor監控python3程序呢?本文主要講述Supervisor在CentOS下的安裝部署。

1. 安裝及設置

可通過pip3安裝,如果你已經是python3的pip3,可以用一下命令安裝

pip3 install git+https://github.com/Supervisor/supervisor    

如果是python2,可以用CentOS (系統自帶Python2)的yum安裝

sudo yum install supervisor

運行echo_supervisord_conf > /etc/supervisor/supervisord.conf來產生設置,未避免產生非root用戶的權限錯誤,將/etc/supervisor/supervisord.conf[unix_http_server]這項改為 (修改chmod):

[unix_http_server]
file=/tmp/supervisor.sock   ; (the path to the socket file)
chmod=0766                 ; socket file mode (default 0700)
;chown=nobody:nogroup       ; socket file uid:gid owner
;username=user              ; (default is no username (open server))
;password=123               ; (default is no password (open server))

再將末尾的[include]部分改為:

[include]
files = /etc/supervisor/*.conf ;如果后面啟動出錯,“說已經include path了”,把這行刪掉
files = /etc/supervisor/conf.d/*.conf

這樣方便為每個app單獨設置conf文件而不必全部寫在全局設置里面。
在啟動supervisorctl須先啟動supervisord,否則會出現error: <class 'socket.error'>, [Errno 99] Cannot assign requested address: file: /usr/lib/python/socket.py line: 575錯誤:

sudo supervisord -c /etc/supervisor/supervisord.conf  (先啟動supervisord)
sudo supervisorctl -c /etc/supervisor/supervisord.conf

如果 supervisord 出錯:

Error: Another program is already listening on a port that one of our HTTP servers is configured to use.  Shut this program down first before starting supervisord.
For help, use /bin/supervisord -h

找到和關閉supervisord process

ps -ef | grep supervisord

You will get some pid of supervisord just like these:

root 2641 12938 0 04:52 pts/1 00:00:00 grep --color=auto supervisord
root 29646 1 0 04:45 ? 00:00:00 /usr/bin/python /usr/local/bin/supervisord

if you get output like that, your pid is the second one. then if you want to shut down your supervisord you can do this

kill -s SIGTERM 29646

hope it helpful. ref: http://supervisord.org/running.html#signals

 

2. 幾個例子

example 1:

[program:awesome]
environment=PYTHONPATH='/home/username/.local/lib/python3.6/site-packages/' ;這行非常重要,后面運行的時候,如果出錯,說找不到package, 需要在這里指定package的path
command     = /usr/bin/python3 /srv/awesome/www/app.py
directory   = /srv/awesome/www
user        = yshi2
startsecs   = 3

redirect_stderr         = true
stdout_logfile_maxbytes = 50MB
stdout_logfile_backups  = 10
stdout_logfile          = /srv/awesome/log/app.log

 

example 2:

[program:app]
directory = ~/su/ ; 程序的啟動目錄
command = /home/hadoop/anaconda3/bin/python /home/hadoop/su/app.py  ; 啟動命令,可以看出與手動在命令行啟動的命令是一樣的,注意這里home不可用~代替
autostart = true     ; 在 supervisord 啟動的時候也自動啟動
startsecs = 5        ; 啟動 5 秒后沒有異常退出,就當作已經正常啟動了
autorestart = true   ; 程序異常退出后自動重啟
startretries = 3     ; 啟動失敗自動重試次數,默認是 3
user = hadoop          ; 用哪個用戶啟動
redirect_stderr = true  ; 把 stderr 重定向到 stdout,默認 false
stdout_logfile_maxbytes = 20MB  ; stdout 日志文件大小,默認 50MB
stdout_logfile_backups = 20     ; stdout 日志文件備份數
; stdout 日志文件,需要注意當指定目錄不存在時無法正常啟動,所以需要手動創建目錄(supervisord 會自動創建日志文件)
stdout_logfile = /tmp/app.log

 

再介紹兩個有用的配置項stopasgroupkillasgroup,如果我們用Flask等Rest服務,通常其會開啟幾個進程,那么如果stopasgroup不啟用的話,supervisor無法重啟此服務(關閉主進程時其子進程沒有關閉,再開啟主進程時會提示端口被占用等錯誤信息)。

; 默認為 false,如果設置為 true,當進程收到 stop 信號時,會自動將該信號發給該進程的子進程。如果這個配置項為 true,那么也隱含 killasgroup 為 true。例如在 Debug 模式使用 Flask 時,Flask 不會將接收到的 
;stop 信號也傳遞給它的子進程,因此就需要設置這個配置項。 stopasgroup
=false ; send stop signal to the UNIX process ; 默認為 false,如果設置為 true,當進程收到 kill 信號時,會自動將該信號發給該進程的子進程。如果這個程序使用了 python 的 multiprocessing 時,就能自動停止它的子線程。 killasgroup=false ; SIGKILL the UNIX process group (def false)

這里我們可以看出,雖然supervisor是python2寫的,但只要我們指定運行的python3解釋器去運行程序就行了。

運行supervisorctl,即可在shell里面方便的操作,如start apprestart app等。

若需要web界面,可在/etc/supervisor/supervisord.conf內修改,

[inet_http_server]         ; inet (TCP) server disabled by default
port=127.0.0.1:9001        ; (ip_address:port specifier, *:port for all iface, 若的形式*:port則開放外網訪問 )
;username=user              ; (default is no username (open server))
;password=123               ; (default is no password (open server))

重啟supervisorctl后即可在127.0.0.1:9001見到web界面,

 

3. 注意事項

  • 如果修改了 /etc/supervisord.conf ,需要執行 supervisorctl reload 來重新加載配置文件,否則不會生效。。。
  • 很多時候用supervisor管理后台進程容易失敗,如hbase/bin/hbase-daemon.sh start thrift,這時候可以改用前台進程如/usr/local/hbase/bin/hbase thrift start
  • 可以讓supervisord service 隨機啟動
systemctl enable supervisord
systemctl restart supervisord

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM