Neo君作為一只小白,今天踩到了一個supervisor的坑。
如上圖所示,出現這種情況后,想把這個進程停止、或者重啟,甚至stop all它還是這個樣子,如下圖(馬賽克部分為進程名稱):
一:背景
在服務器上部署幾個單獨跑的程序,使用supervisor進行管理。關於supervisor的安裝、配置運行等,Neo君不再贅述,百度能到一大堆。這里只介紹幾個我用到的覺得有用的命令。
#啟動supervisor, supervisord.conf為配置文件 supervisord -c xxx/supervisord.conf #supervisord.conf 部分配置 [program:program-name] command = /root/program-name.sh ;啟動程序的腳本(位置自定義) numprocs = 1 ;number of processes copies to start autostart = true ;在 supervisord 啟動的時候也自動啟動 autorestart = true ;程序異常退出后自動重啟 startretries = 10 ;啟動失敗自動重試次數,默認是 3 startsecs = 10 ;啟動 10 秒后沒有異常退出,就當作已經正常啟動了 stopsignal = KILL ;干掉進程的信號,默認為TERM redirect_stderr=true ;把 stderr 重定向到 stdout,默認 false exitcodes = 0,2 ;進程退出碼,autorestart=unexpected時有用 stdout_logfile=/program-name/logs/program-name.log ;日志輸出目錄(可自定義) #supervisorctl 是supervisord的客戶端,可以管理進程,常用命令 status # 查看程序狀態 start program-name # 啟動程序 stop program-name # 關閉 程序 restart program-name # 重啟程序 reread # 讀取有更新(增加)的配置文件,不會啟動新添加的程序 update # 重啟配置文件修改過的程序
二:問題:程序PID為0
替換新版本的程序的時候,再重新啟動某個程序,發現出現了一開始的問題。
三:解決
可以參見github上的問題https://github.com/Supervisor/supervisor/issues/445
經過查詢Neo君發現,這個問題好像是由於,文件權限引起的。Neo君在配置的時候配置了一個日志輸出目錄:
stdout_logfile=/program-name/logs/program-name.log ;日志輸出目錄(可自定義)
但是,項目新部署的時候,沒有logs目錄,即/program-name/ 下沒有logs文件夾,然后啟動的時候報了個錯
supervisor> supervisor> start program-name error: <class 'xmlrpclib.ProtocolError'>, <ProtocolError for 127.0.0.1/RPC2: 500 Internal Server Error>: file: /usr/lib/python2.6/site-packages/supervisor-3.1.3-py2.6.egg/supervisor/xmlrpc.py line: 470
再查看程序就變成了pid=0。但是,沒有什么停止的方法,Neo君就殺了進程(如果有什么好的停止方法請告知)。
建立文件夾,在啟動腳本里加入了建立logs目錄的代碼。可以參考
if [ ! -e "$base_home/logs" ] ; then mkdir "$base_home/logs" fi
四:總結
supervisor 使用出現程序PID為0 的時候,應該是文件權限的問題。
1.啟動時注意報錯內容,看看是哪個文件
2.查看文件夾是否存在,或是否有權限