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


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.查看文件夾是否存在,或是否有權限


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM