參照官網配置:https://channels.readthedocs.io/en/latest/deploying.html
1.supervisor
主要是用來管理進程,比如我們想讓一個進程一直執行當前退出時,自動重啟
分為客戶端和服務器端
supervisord 服務器主管名為supervisord。它負責在自己的調用中啟動子程序,響應來自客戶端的命令,重新啟動崩潰或退出的子進程,記錄其子進程stdout和stderr 輸出,以及生成和處理與子進程生命周期中的點相對應的“事件”。 服務器進程使用配置文件。這通常位於/etc/supervisord.conf中。此配置文件是“Windows-INI”樣式配置文件。通過適當的文件系統權限保持此文件的安全非常重要,因為它可能包含未加密的用戶名和密碼。 supervisorctl 主管的命令行客戶端部分名為 supervisorctl。它為supervisord提供的功能提供了類似shell的界面。從 supervisorctl,用戶可以連接到不同的 supervisord進程(一次一個),獲取由子進程控制的狀態,停止和啟動子進程,並獲取supervisord的運行進程列表。 命令行客戶端通過UNIX域套接字或Internet(TCP)套接字與服務器通信。服務器可以聲明客戶端的用戶在允許他執行命令之前應該提供身份驗證憑據。客戶端進程通常使用與服務器相同的配置文件,但其中包含[supervisorctl]部分的任何配置文件都可以使用。
啟動
/usr/local/bin/supervisord -c /etc/supervisord.conf
supervisord,初始啟動Supervisord,啟動、管理配置中設置的進程。
supervisorctl stop programxxx,停止某一個進程(programxxx),programxxx為[program:chatdemon]里配置的值,這個示例就是chatdemon。
supervisorctl start programxxx,啟動某個進程
supervisorctl restart programxxx,重啟某個進程
supervisorctl stop all,停止全部進程,注:start、restart、stop都不會載入最新的配置文件。
supervisorctl reload,載入最新的配置文件,並按新的配置啟動、管理所有進程。
啟動守護進程:supervisord -c /etc/supervisor/supervisord.conf 重載配置:supervisorctl reload
報錯信息:
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
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之后居然就可以跑了
生成配置文件
安裝好supervisor之后,默認是沒有生成配置文件的。可以通過以下命令生成配置文件
echo_supervisord_conf > /etc/supervisord.conf
我們通常是把配置文件放到/etc/下面,當然也可以放到任意路徑下面。
啟動
以下啟動順序由上到下優先級,依次遞減
supervisord #默認去找$CWD/supervisord.conf,也就是當前目錄 supervisord #默認$CWD/etc/supervisord.conf,也就當前目錄下的etc目錄 supervisord #默認去找/etc/supervisord.conf的配置文件 supervisord -c /home/supervisord.conf #到指定路徑下去找配置文件
supervisor組件
還有一個比較坑的 如果你是直接把laravel官方文檔中的supervisor配置拿過來的話 一定記得改驅動如下圖所
nodaemon=false ; 如果是true,supervisord進程將在前台運行 默認為false,也就是后台以守護進程運行。。。非必須設置
supervisorctl reload
### 或者 supervisorctl -c /etc/supervisord.conf
默認supervisor是不啟動的
那個-n -c 是個前台程序沒有用的
# 如果是 Ubuntu 添加以下內容(這里要寫全路徑,因為此時PATH的環境變量未必設置) /usr/local/bin/supervisord -c /etc/supervisord.conf # 如果是 Centos 添加以下內容 /usr/bin/supervisord -c /etc/supervisord.conf
查看正在守候的進程
supervisorctl
如果沒有開機自啟,那么最開始是需要啟動服務的。。。需要unlink