今天踩到了一個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
替換新版本的程序的時候,再重新啓動某個程序,發現出現了一開始的問題。
三:解決
可以直接重啓整個supervisor服務或者-------下面的
經過查詢發現,這個問題好像是由於,文件權限引起的。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