在項目中,經常有腳本需要常駐運行的需求。以PHP腳本為例,最簡單的方式是:
$ nohup php cli.php &
這樣能保證當前終端被關閉或者按CRTL+C后,腳本仍在后台運行。但是沒法保證腳本異常后自動重啟等。
本文所用環境:
- 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加入開機啟動項
六、常見問題
-
unix:///var/run/supervisor.sock no such file
問題描述:安裝好supervisor沒有開啟服務直接使用supervisorctl報的錯
解決辦法:supervisord -c /etc/supervisord.conf
-
command中指定的進程已經起來,但supervisor還不斷重啟
問題描述:command中啟動方式為后台啟動,導致識別不到pid,然后不斷重啟,這里使用的是elasticsearch,command指定的是$path/bin/elasticsearch -d
解決辦法:supervisor無法檢測后台啟動進程的pid,而supervisor本身就是后台啟動守護進程,因此不用擔心這個 -
啟動了多個supervisord服務,導致無法正常關閉服務
問題描述:在運行supervisord -c /etc/supervisord.conf
之前,直接運行過supervisord -c /etc/supervisord.d/xx.conf
導致有些進程被多個superviord管理,無法正常關閉進程。
解決辦法:使用ps -fe | grep supervisord
查看所有啟動過的supervisord服務,kill相關的進程。