supervisor 安裝和使用教程


在項目中,經常有腳本需要常駐運行的需求。以PHP腳本為例,最簡單的方式是:

$ nohup php cli.php & 

這樣能保證當前終端被關閉或者按CRTL+C后,腳本仍在后台運行。但是沒法保證腳本異常后自動重啟等。

官網介紹:http://supervisord.org/

Supervisor是用Python開發的一套通用的進程管理程序,能將一個普通的命令行進程變為后台daemon,並監控進程狀態,異常退出時能自動重啟。它是通過fork/exec的方式把這些被管理的進程當作supervisor的子進程來啟動,這樣只要在supervisor的配置文件中,把要管理的進程的可執行文件的路徑寫進去即可。也實現當子進程掛掉的時候,父進程可以准確獲取子進程掛掉的信息的,可以選擇是否自己啟動和報警。supervisor還提供了一個功能,可以為supervisord或者每個子進程,設置一個非root的user,這個user就可以管理它對應的進程

本文所用環境:

  • CentOS 7
  • Python 2.7.5
  • supervisor 3.3.4

一、supervisor安裝

  • 配置好yum源后,可以直接安裝【本文安裝方法】

    yum install supervisor

查看安裝的版本:

supervisord -v

二、supervisor啟動

supervisord -c /etc/supervisord.conf

三、supervisor使用

supervisor配置文件:/etc/supervisord.conf

注:supervisor的配置文件默認是不全的,不過在大部分默認的情況下,上面說的基本功能已經滿足。

子進程配置文件路徑:/etc/supervisord.d/

注:默認子進程配置文件為ini格式,可在supervisor主配置文件中修改。

四、supervisor使用

給需要管理的子進程(程序)編寫一個配置文件,放在 /etc/supervisor.d/目錄下,以 .ini作為擴展名(每個進程的配置文件都可以單獨分拆也可以把相關的腳本放一起)。如任意定義一個和腳本相關的項目名稱的選項組(/etc/supervisord.d/test.ini):
[program:queue]
command=php /www/group/yii queue/listen
numprocs=2
process_name=%(program_name)s_%(process_num)02d
autostart=true
autorestart=true
user=root
logfile=/tmp/queue.log

[program:import-queue]
command=php /www/group/yii import-queue/listen
numprocs=2
process_name=%(program_name)s_%(process_num)02d
autostart=true
autorestart=true
user=root
logfile=/tmp/import-queue.log

子進程配置文件說明:

;*為必須填寫項
;*[program:應用名稱]
[program:cat]

;*命令路徑,如果使用python啟動的程序應該為 python /home/test.py, 
;不建議放入/home/user/, 對於非user用戶一般情況下是不能訪問
command=/bin/cat

;當numprocs為1時,process_name=%(program_name)s;
當numprocs>=2時,%(program_name)s_%(process_num)02d
process_name=%(program_name)s

;進程數量
numprocs=1

;執行目錄,若有/home/supervisor_test/test1.py
;將directory設置成/home/supervisor_test
;則command只需設置成python test1.py
;否則command必須設置成絕對執行目錄
directory=/tmp

;掩碼:--- -w- -w-, 轉換后rwx r-x w-x
umask=022

;優先級,值越高,最后啟動,最先被關閉,默認值999
priority=999

;如果是true,當supervisor啟動時,程序將會自動啟動
autostart=true

;*自動重啟
autorestart=true

;啟動延時執行,默認1秒
startsecs=10

;啟動嘗試次數,默認3次
startretries=3

;當退出碼是0,2時,執行重啟,默認值0,2
exitcodes=0,2

;停止信號,默認TERM
;中斷:INT(類似於Ctrl+C)(kill -INT pid),退出后會將寫文件或日志(推薦)
;終止:TERM(kill -TERM pid)
;掛起:HUP(kill -HUP pid),注意與Ctrl+Z/kill -stop pid不同
;從容停止:QUIT(kill -QUIT pid)
;KILL, USR1, USR2其他見命令(kill -l),說明1
stopsignal=TERM

stopwaitsecs=10

;*以root用戶執行
user=root

;重定向
redirect_stderr=false

stdout_logfile=/a/path
stdout_logfile_maxbytes=1MB
stdout_logfile_backups=10
stdout_capture_maxbytes=1MB
stderr_logfile=/a/path
stderr_logfile_maxbytes=1MB
stderr_logfile_backups=10
stderr_capture_maxbytes=1MB

;環境變量設置
environment=A="1",B="2"

serverurl=AUTO

五、supervisor命令說明

supervisorctl status        //查看所有進程的狀態
supervisorctl stop es       //停止es
supervisorctl start es      //啟動es
supervisorctl restart es    //重啟es
supervisorctl update es     //配置文件修改后使用該命令加載新的配置
supervisorctl reload        //重新啟動配置中的所有程序

注:把es換成all可以管理配置中的所有進程。直接輸入supervisorctl進入supervisorctl的shell交互界面,此時上面的命令不帶supervisorctl可直接使用。

  • help # 查看幫助
  • exit #退出
  • status # 查看程序狀態
  • stop program_name # 關閉 指定的程序
  • start program_name # 啟動 指定的程序
  • restart program_name # 重啟 指定的程序
  • tail -f program_name # 查看 該程序的日志
  • update program_name # 重啟配置文件修改過的程序(修改了配置,通過這個命令加載新的配置)

使用supervisor進程管理命令之前先啟動supervisord,否則程序報錯。
使用命令supervisord -c /etc/supervisord.conf啟動。

systemctl start supervisord.service     //啟動supervisor並加載默認配置文件
systemctl enable supervisord.service    //將supervisor加入開機啟動項

六、常見問題

  1. unix:///var/run/supervisor.sock no such file
    問題描述:安裝好supervisor沒有開啟服務直接使用supervisorctl報的錯
    解決辦法:supervisord -c /etc/supervisord.conf

  2. command中指定的進程已經起來,但supervisor還不斷重啟
    問題描述:command中啟動方式為后台啟動,導致識別不到pid,然后不斷重啟,這里使用的是elasticsearch,command指定的是$path/bin/elasticsearch -d
    解決辦法:supervisor無法檢測后台啟動進程的pid,而supervisor本身就是后台啟動守護進程,因此不用擔心這個

  3. 啟動了多個supervisord服務,導致無法正常關閉服務
    問題描述:在運行supervisord -c /etc/supervisord.conf之前,直接運行過supervisord -c /etc/supervisord.d/xx.conf導致有些進程被多個superviord管理,無法正常關閉進程。
    解決辦法:使用ps -fe | grep supervisord查看所有啟動過的supervisord服務,kill相關的進程。

 


免責聲明!

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



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