supervisor 永不掛掉的進程 安裝以及使用

在使用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的;
5b5888b468e0e.pngvim

5b5888cf26f49.png

5b5888e4a6449.png

以後生成配置文件:服務器

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

5b588a07dce5a.png

我在執行的時候遇到錯誤了,下面會說錯誤的處理的問題以及解決辦法;

如今咱們來測試;
首先在測試的時候執行 stop 將進程中止,以後再打開一個終端鏈接redis,咱們執行登陸,執行後登陸後的隊列任務會在redis一直存在;

supervisorctl stop test 或者直接 supervisorctl stop all

5b588ab662a08.png

能夠看到是沒有被執行的!如今咱們開supervisorctl 的test進程
5b5887de1f28b.png

5b588ac471aa8.png

接下來講一下問題:
問題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.

5b588add37fa1.png

5b588ae748e75.png

解決辦法:

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掉竟然均可以執行,因此將服務器重啓了!

相關文章
相關標籤/搜索