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