一:基本命令
reread ;重新加載配置文件
update ;將配置文件里新增的子進程加入進程組,如果設置了autostart=true則會啟動新新增的子進程
status ;查看所有進程狀態
status ;查看指定進程狀態
start all; 啟動所有子進程
start ; 啟動指定子進程
restart all; 重啟所有子進程
restart ; 重啟指定子進程
stop all; 停止所有子進程
stop ; 停止指定子進程
reload ;重啟supervisord
add ; 添加子進程到進程組
reomve ; 從進程組移除子進程,需要先stop。注意:移除后,需要使用reread和update才能重新運行該進程
二:子程序相關配置
[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
這個可能有多種原因,可能是已經啟動過了也可能是沒權限,解決步驟如下:
- 先要確認是否已經啟動過了:’ps -ef | grep supervisord’
- 如果有的話先kill掉
- 運行下面命令:
sudo touch /var/run/supervisor.sock
sudo chmod 777 /var/run/supervisor.sock - 再嘗試重新啟動:supervisord -c /etc/supervisord.conf(如果沒有文件找個別人的配置拷貝過來或者運行echo_supervisord_conf > /etc/supervisord.conf)
5、Error: .ini file does not include supervisorctl section
- 先確保supervisord.conf中有[supervisord],[supervisorctl]有這兩個基本模塊,還有[program:XXX]自己程序的配置(可以在supervisord.conf也可以在/etc/supervisor/*.ini中)
- 最關鍵的兩個命令:chmod +x /usr/bin/supervisord
chmod +x /usr/bin/supervisorctl
chmod +x /etc/supervisord.conf主要是把把相關文件都授權了 - 把supervisord殺掉后再次啟動supervisord
6、Exited too quickly (process log may have details)
- 先確認[program:XXX]中自己的程序的command=<啟動命令>和 directory=<運行命令的路徑>沒有問題,python是不是用的自己要的環境的python(比如虛擬環境的),log文件的文件夾是不是已經創建(沒創建的話supervisor沒權限生成log文件),以及改log文件是不是授權給所有用戶了(可參考前面的解決辦法chmod +x aaaaa.log)
- 確保用上面的配置中的command在指定路徑可以直接運行不會報錯,這時候一般就不會有什么問題了。這時候tail你自己的log文件一般就能看到log信息,啟動失敗報錯的信息也會在你的log文件中,照着解決后supervisorctl reload就好了。
- 如果上面的命令確保可以跑,但還是沒法正常運行,也看不到自己程序的報錯(不然你就能根據報錯解決問題了),那么恭喜,你遇到了跟我一樣的情況。我的解決辦法很詭異,嘗試把[program:XXX]中的名字換成了一個跟啟動命令不一樣的另一個名字(不要太短),reload之后居然就可以跑了。。。。嗯,很不合常理,但是對我來說確實管用了。
文章來源於:https://blog.csdn.net/qq_38234594/article/details/89923583