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

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

安裝及設置

可經過pip3安裝,若是你已是python3的pip3,能夠用一下命令安裝python

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

若是是python2,能夠用CentOS (系統自帶Python2)的yum安裝git

sudo yum install supervisor

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

[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]部分改成:web

[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錯誤:shell

1 sudo supervisord -c /etc/supervisor/supervisord.conf  (先啓動supervisord)
2 sudo supervisorctl -c /etc/supervisor/supervisord.conf

若是 supervisord 出錯:app

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
ps -ef | grep supervisord

You will get some pid of supervisord just like thesesocket

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

/etc/supervisor/conf.d/裏新建app.conf文件(這是咱們本身的conf,用來啓停本身的程序),

 1 [program:awesome]
 2 environment=PYTHONPATH='/home/username/.local/lib/python3.6/site-packages/'  ;這行很是重要,後面運行的時候,若是出錯,說找不到package, 須要在這裏指定package的path
 3 command     = /usr/bin/python3 /srv/awesome/www/app.py
 4 directory   = /srv/awesome/www
 5 user        = yshi2
 6 startsecs   = 3
 7 
 8 redirect_stderr         = true
 9 stdout_logfile_maxbytes = 50MB
10 stdout_logfile_backups  = 10
11 stdout_logfile          = /srv/awesome/log/app.log

其餘的例子:

 1 [program:app]
 2 directory = ~/su/ ; 程序的啓動目錄
 3 command = /home/hadoop/anaconda3/bin/python /home/hadoop/su/app.py  ; 啓動命令,能夠看出與手動在命令行啓動的命令是同樣的,注意這裏home不可用~代替
 4 autostart = true     ; 在 supervisord 啓動的時候也自動啓動
 5 startsecs = 5        ; 啓動 5 秒後沒有異常退出,就看成已經正常啓動了
 6 autorestart = true   ; 程序異常退出後自動重啓
 7 startretries = 3     ; 啓動失敗自動重試次數,默認是 3
 8 user = hadoop          ; 用哪一個用戶啓動
 9 redirect_stderr = true  ; 把 stderr 重定向到 stdout,默認 false
10 stdout_logfile_maxbytes = 20MB  ; stdout 日誌文件大小,默認 50MB
11 stdout_logfile_backups = 20     ; stdout 日誌文件備份數
12 ; stdout 日誌文件,須要注意當指定目錄不存在時沒法正常啓動,因此須要手動建立目錄(supervisord 會自動建立日誌文件)
13 stdout_logfile = /tmp/app.log

再介紹兩個有用的配置項stopasgroupkillasgroup,若是咱們用Flask等Rest服務,一般其會開啓幾個進程,那麼若是stopasgroup不啓用的話,supervisor沒法重啓此服務(關閉主進程時其子進程沒有關閉,再開啓主進程時會提示端口被佔用等錯誤信息)。

1 ; 默認爲 false,若是設置爲 true,當進程收到 stop 信號時,會自動將該信號發給該進程的子進程。若是這個配置項爲 true,那麼也隱含 killasgroup 爲 true。例如在 Debug 模式使用 Flask 時,Flask 不會將接收到的 stop 信號也傳遞給它的子進程,所以就須要設置這個配置項。
2 stopasgroup=false             ; send stop signal to the UNIX process 
3 ; 默認爲 false,若是設置爲 true,當進程收到 kill 信號時,會自動將該信號發給該進程的子進程。若是這個程序使用了 python 的 multiprocessing 時,就能自動中止它的子線程。
4 killasgroup=false             ; SIGKILL the UNIX process group (def false)    

這裏咱們能夠看出,雖然supervisor是python2寫的,但只要咱們指定運行的python3解釋器去運行程序就好了。

運行supervisorctl,便可在shell裏面方便的操做,如start apprestart app等。

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

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

重啓supervisorctl後便可在127.0.0.1:9001見到web界面,

注意事項

  • 若是修改了 /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
相關文章
相關標籤/搜索