supervisor :a running process with pid = 0,程序PID爲0

今天踩到了一個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
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章