基本思路:
- 首先我們要明确問題出在supervisor上還是啟動的程式上,可以用
檢視是否啟動,在用ps檢視自己的程序有沒有啟動;ps -ef | grep supervisord
- 确認下啟動的supervisor配置檔案是哪個,有的是/etc/supervisor/supervisord.conf,有的是/etc/supervisord.conf,以自己的為準,不要弄混;
- 推薦使用apt-get安裝,其次是pip ,最後才是yum。不要問為什麼,踩坑踩得。另外,盡量用supervisord 3.x以上的版本,2.x版本出問題機率大;
- supervisord的日志在 /var/log/supervisor/supervisord.log,啟動失敗一般能再這裡找到有用的資訊
常用指令
-
啟動守護程序:supervisord -c /etc/supervisor/supervisord.conf
-
重載配置:supervisorctl reload
具體報錯分析
下面是三種常見的通用報錯:
第一類:
報錯資訊:
error: <class 'socket.error'>, [Errno 2] No such file or directory: file: <string> 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)
第二類:
報錯資訊:
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)
如果前面的問題都解決了,但還是會遇到這個問題,恭喜你已經離勝利很近了,起碼supervisord本身已經沒什麼問題了^_^
解決辦法:
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程序管理
supervisor 程序管理