在使用Tp的消息隊列 think-queue的時候進程意外結束了!致使項目無法運行;php
因此用到了supervisor; 接下來跟你們分享一下本身的使用心得以及安裝到使用的方法;html
官網:http://supervisord.org/introd...
首先安裝 有不少辦法;
01:wget 下載壓縮包:python
cd /usr/local/lee #這個lee是我本身創建的一個目錄 wget https://pypi.python.org/packages/7b/17/88adf8cb25f80e2bc0d18e094fcd7ab300632ea00b601cbbbb84c2419eae/supervisor-3.3.2.tar.gz tar -zxvf supervisor-3.3.2.tar.gz cd supervisor-3.3.2 python setup.py install
02: yum安裝:redis
yum install python-setuptools easy_install supervisor
咱們安裝的時候使用wget的;
vim
以後生成配置文件:服務器
mkdir /etc/supervisor echo_supervisord_conf > /etc/supervisord.conf
打開配置文件修改一點東西;socket
vim /etc/supervisord.conf
要將底部的測試
;[include] ;files = relative/directory/*.ini 修改成: [include] files=/etc/supervisor/*.conf (注意去掉分號,第一次安裝的時候就由於沒去掉分號出現了問題!);
以後建立一個文件 文件名隨意 後綴爲.conf的,我這裏就建立一個test.conf的文件;
個人項目在/www/wwwroot/admin/目錄下:ui
vim test.conf #寫入一些配置: [program:test] # 設置進程的名稱,使用 supervisorctl 來管理進程時須要使用該進程名 我這裏就叫作test了! command=php think queue:work --queue saveLoginLog --daemon --tries 10; #這個就是隊列執行的命令 directory= /www/wwwroot/admin; #命令執行的目錄或者說執行 command 以前,先切換到工做目錄 能夠理解爲在執行命令前會切換到這個目錄 process_name=%(process_num)02d; #默認爲 %(program_name)s,即 [program:x] 中的 x 這個是進程名,若是咱們下面的numprocs參數爲1的話,就不用管這個參數 了,它默認值%(program_name)s也就是上面的那個program冒號後面的 numprocs=5; #進程數量當不爲1時的時候,就是進程池的概念,注意process_name的設置 autostart=true; #是否自動啓動 autorestart=true; #程序意外退出是否自動重啓 startsecs=1; 自動重啓間隔 startretries=20; 當進程啓動失敗後,最大嘗試啓動的次數。。當超過3次後,supervisor將把此進程的狀態置爲FAIL 默認值爲3 。。 redirect_stderr=true; 若是爲true,則stderr的日誌會被寫入stdout日誌文件中 理解爲重定向輸出的日誌 user=root; 這個參數能夠設置一個非root用戶,當咱們以root用戶啓動supervisord以後。我這裏面設置的這個用戶,也能夠對supervisord進行管理 stdout_logfile= /www/wwwroot/admin/test.out.log; 子進程的stdout的日誌路徑 輸出日誌文件 stderr_logfile=/www/wwwroot/admin/test.err.log ; 錯誤日誌文件 當redirect_stderr=true。這個就不用
上面有註釋說明的看起來有點混亂,咱們來寫一個沒有註釋的:this
[program:test] command=php think queue:work --queue saveLoginLog --daemon --tries 10 directory= /www/wwwroot/admin process_name=%(process_num)02d numprocs=5 autostart=true autorestart=true startsecs=1 startretries=20 redirect_stderr=true user=root stdout_logfile= /www/wwwroot/admin/test.out.log stderr_logfile=/www/wwwroot/admin/test.err.log
以後執行啓動:
supervisord -c /etc/supervisord.conf supervisorctl reload
我在執行的時候遇到錯誤了,下面會說錯誤的處理的問題以及解決辦法;
如今咱們來測試;
首先在測試的時候執行 stop 將進程中止,以後再打開一個終端鏈接redis,咱們執行登陸,執行後登陸後的隊列任務會在redis一直存在;
supervisorctl stop test 或者直接 supervisorctl stop all
能夠看到是沒有被執行的!如今咱們開supervisorctl 的test進程
接下來講一下問題:
問題1:
Unlinking stale socket /tmp/supervisor.sock
或者:
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.
解決辦法:
sudo unlink /tmp/supervisor.sock or sudo unlink /var/run/supervisor.sock
問題2:
gave up: redis entered FATAL state, too many start retries too quickly
解決辦法:
修改redis.conf的daemonize爲no
其餘問題暫時沒有發現;我在測試的時候進程kill掉竟然均可以執行,因此將服務器重啓了!