zoukankan      html  css  js  c++  java
  • 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.查看文件夹是否存在,或是否有权限

  • 相关阅读:
    linux各文件夹的作用
    CodeIgniter的URL传过来的中文参数处理错误的修复
    syn_ack攻击
    分治排序
    Linux Shell学习笔记
    sql题型
    jquery ajax
    json 字符串与对象之间的转换
    常用的VIM命令列表 移动光标
    visual c++ 2012 内存泄漏检测方法
  • 原文地址:https://www.cnblogs.com/LordNeo/p/8135959.html
Copyright © 2011-2022 走看看