supervisor安裝配置以及常見的錯誤

一、安裝:

liunx:

1 - 安裝 setuptools (python2)

yum install python-setuptools

2 - 安裝 supervisor (只支持python2)

easy_install或者pip安裝,注意supervisor當前只有python2支持的版本。
pip install supervisor

Mac:

安裝:brew install supervisor
自動隨系統啓動:brew services start supervisor
也可以 手動啓動:
supervisord -c /usr/local/etc/supervisord.ini
進入
supervisorctl -c /usr/local/etc/supervisord.ini ;後面的一段可以不要

進入supervisor:supervisorctl

二、基本命令

reread ;重新加載配置文件
update ;將配置文件裏新增的子進程加入進程組,如果設置了autostart=true則會啓動新新增的子進程
status ;查看所有進程狀態
status ;查看指定進程狀態
start all; 啓動所有子進程
start ; 啓動指定子進程
restart all; 重啓所有子進程
restart ; 重啓指定子進程
stop all; 停止所有子進程
stop ; 停止指定子進程
reload ;重啓supervisord
add ; 添加子進程到進程組
reomve ; 從進程組移除子進程,需要先stop。注意:移除後,需要使用reread和update才能重新運行該進程

三、基本配置:

[unix_http_server]:這部分設置HTTP服務器監聽的UNIX domain socket

file: 指向UNIX domain socket,即file=/var/run/supervisor.sock
chmod:啓動時改變supervisor.sock的權限

[inet_http_server]啓動 supervisorctl 客戶端後,可以用瀏覽器打開輸入用戶名、密碼後,進入web界面

port=127.0.0.1:9001 ; ip_address:port specifier, *:port for all iface
username=root ; default is no username (open server)
password=123 ; default is no password (open server)

[supervisord]:與supervisord有關的全局配置需要在這部分設置

logfile=/usr/local/var/log/supervisord.log ;日誌文件,默認是 $CWD/supervisord.log
logfile_maxbytes=50MB ;日誌文件大小,超出會rotate,默認 50MB,如果設成0,表示不限制大小
logfile_backups=10 ;日誌文件保留備份數量默認10,設爲0表示不備份
loglevel=info ;日誌級別,默認info,其它: debug,warn,trace
pidfile=/usr/local/supervisor-3.3.4/supervisord.pid ;pid 文件
nodaemon=false ;是否在前臺啓動,默認是false,即以 daemon 的方式啓動
minfds=1024 ;可以打開的文件描述符的最小值,默認 1024
minprocs=200 ;可以打開的進程數的最小值,默認 200

[supervisorctl]:

serverurl:進入supervisord的URL, 對於UNIX domain sockets, 應設爲 unix:///absolute/path/to/file.sock

[include]:如果配置文件包含該部分,則該部分必須包含一個files鍵:

files:包含一個或多個文件,這裏包含了/etc/supervisor/conf.d/目錄下所有的.conf文件,可以在該目錄下增加我們自己的配置文件,在該配置文件中增加[program:x]部分,用來運行我們自己的程序,如下:

子程序的相關配置

[program:capital-balance] :配置文件必須包括至少一個program,x是program名稱,必須寫上,不能爲空
directory = /Library/WebServer/Documents/project ;執行子進程時supervisord暫時切換到該目錄
command = /bin/bash -c ‘./yii 執行的命令’ ;包含一個命令,當這個program啓動時執行
autostart = true
startsecs = 5
autorestart = true
startretries = 3;進程從STARING狀態轉換到RUNNING狀態program所需要保持運行的時間(單位:秒)
user = user
process_name=%(program_name)s_%(process_num)002d ;當numprocs大於1是需要使用這個
numprocs=2
redirect_stderr = true;如果是true,則進程的stderr輸出被髮送回其stdout文件描述符上的supervisord
stdout_logfile_backups = 20;要保存的stdout_logfile備份的數量
stdout_logfile=/Library/WebServer/Documents/capital/backend/runtime/logs/supervisor/testPopQueue.log;將進程stdout輸出到指定文件
stdout_logfile_maxbytes=10MB;stdout_logfile指定日誌文件最大字節數,默認爲50MB,可以加KB、MB或GB等單位
stderr_logfile=/Library/WebServer/Documents/capital/backend/runtime/logs/supervisor/testPopQueue-err.log
stderr_logfile_maxbytes=10MB

四、常見的錯誤:

1、Error: %(process_num) must be present within process_name when numprocs > 1 in section ‘program:capital-balance’ (file: ‘/usr/local/etc/supervisor.d/logstash.ini’)

For help, use /usr/local/bin/supervisord -h
;當numprocs爲1時,process_name=%(program_name)s
;當numprocs>=2時,%(program_name)s_%(process_num)02d
process_name=%(program_name)s

2、直接運行 supervisorctl status 報:

Error: Server requires authentication
For help, use /usr/local/bin/supervisorctl -h
因爲你設置訪問賬號密碼,所以只能先supervisorctl進去,在status,其他命令也如此;

3、supervisord -c /usr/local/etc/supervisord.ini報:

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 /usr/local/bin/supervisord -h
因爲9001獲取其他你設置的端口被佔用了,你可以先lsof -i:9002 kill:pid再重新執行該命令就可以了;

4、啓動腳本時報:

error: <class ‘socket.error’>, [Errno 2] No such file or directory: file: line: 1
這個可能有多種原因,可能是已經啓動過了也可能是沒權限,解決步驟如下:

  1. 先要確認是否已經啓動過了:’ps -ef | grep supervisord’
  2. 如果有的話先kill掉
  3. 運行下面命令:
    sudo touch /var/run/supervisor.sock
    sudo chmod 777 /var/run/supervisor.sock
  4. 再嘗試重新啓動:supervisord -c /etc/supervisord.conf(如果沒有文件找個別人的配置拷貝過來或者運行echo_supervisord_conf > /etc/supervisord.conf)
5、Error: .ini file does not include supervisorctl section
  1. 先確保supervisord.conf中有[supervisord],[supervisorctl]有這兩個基本模塊,還有[program:XXX]自己程序的配置(可以在supervisord.conf也可以在/etc/supervisor/*.ini中)
  2. 最關鍵的兩個命令:chmod +x /usr/bin/supervisord
    chmod +x /usr/bin/supervisorctl
    chmod +x /etc/supervisord.conf主要是把把相關文件都授權了
  3. 把supervisord殺掉後再次啓動supervisord
6、Exited too quickly (process log may have details)
  1. 先確認[program:XXX]中自己的程序的command=<啓動命令>和 directory=<運行命令的路徑>沒有問題,python是不是用的自己要的環境的python(比如虛擬環境的),log文件的文件夾是不是已經創建(沒創建的話supervisor沒權限生成log文件),以及改log文件是不是授權給所有用戶了(可參考前面的解決辦法chmod +x aaaaa.log)
  2. 確保用上面的配置中的command在指定路徑可以直接運行不會報錯,這時候一般就不會有什麼問題了。這時候tail你自己的log文件一般就能看到log信息,啓動失敗報錯的信息也會在你的log文件中,照着解決後supervisorctl reload就好了。
  3. 如果上面的命令確保可以跑,但還是沒法正常運行,也看不到自己程序的報錯(不然你就能根據報錯解決問題了),那麼恭喜,你遇到了跟我一樣的情況。我的解決辦法很詭異,嘗試把[program:XXX]中的名字換成了一個跟啓動命令不一樣的另一個名字(不要太短),reload之後居然就可以跑了。。。。嗯,很不合常理,但是對我來說確實管用了。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章