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

posted @ 2017-12-28 15:30  LordNeo  阅读(1665)  评论(0编辑  收藏  举报