Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/307.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 主管事件:如何侦听所有或指定进程的进程\u状态\u停止事件_Python_Supervisord - Fatal编程技术网

Python 主管事件:如何侦听所有或指定进程的进程\u状态\u停止事件

Python 主管事件:如何侦听所有或指定进程的进程\u状态\u停止事件,python,supervisord,Python,Supervisord,我正在尝试使用supervisord事件来侦听来自由Supervisor管理的进程的进程\u状态\u停止事件 我的事件侦听器(listener.py)如下所示: import sys from supervisor.childutils import listener def write_stdout(s): sys.stdout.write(s) sys.stdout.flush() def write_stderr(s): sys.stderr.write(s

我正在尝试使用supervisord事件来侦听来自由Supervisor管理的进程的
进程\u状态\u停止
事件

我的事件侦听器(
listener.py
)如下所示:

import sys

from supervisor.childutils import listener

def write_stdout(s):
    sys.stdout.write(s)
    sys.stdout.flush()


def write_stderr(s):
    sys.stderr.write(s)
    sys.stderr.flush()


def main():
    while True:
        headers, body = listener.wait(sys.stdin, sys.stdout)
        body = dict([pair.split(":") for pair in body.split(" ")])
        write_stderr("Headers: %r\n" % repr(headers))
        write_stderr("Body: %r\n" % repr(body))
        listener.ok(sys.stdout)

        if headers["eventname"] == "PROCESS_STATE_STOPPED":
            write_stderr("Process state stopped...\n")


if __name__ == '__main__':
    main()
我在
supervisord.conf
中的相应条目如下:

[program:theprogramname]
command=/bin/cat              ; the program (relative uses PATH, can take args)
process_name=%(program_name)s ; process_name expr (default %(program_name)s)
numprocs=1                    ; number of processes copies to start (def 1)
...
[eventlistener:theeventlistenername]
command=python /home/mickm/listener.py    ; the program (relative uses PATH, can take args)
process_name=%(program_name)s_%(process_num)s       ; process_name expr (default %(program_name)s)
numprocs=1                           ; number of processes copies to start (def 1)
events=PROCESS_STATE                 ; event notif. types to subscribe to (req'd)
autorestart=true
redirect_stderr=true
2017-01-13 14:56:36,168 INFO success: theeventlistenername_0 entered RUNNING state, process has stayed up for > than 1 seconds (startsecs)
2017-01-13 14:56:36,168 INFO success: theprogramname entered RUNNING state, process has stayed up for > than 1 seconds (startsecs)
2017-01-13 14:57:29,457 INFO exited: theprogramname (terminated by SIGKILL; not expected)
2017-01-13 14:57:30,460 INFO spawned: 'theprogramname' with pid 25788
2017-01-13 14:57:31,462 INFO success: theprogramname entered RUNNING state, process has stayed up for > than 1 seconds (startsecs)
我研究了该领域的其他StackOverflow问题&我试图从以下方面实施公认的解决方案:

但是,当我运行
listener.py
时,它将
READY
输出到SDOUT&不再继续。我已经尝试过停止/启动和重新启动主管监控的进程,但我的脚本没有发现任何问题

为了验证这一点,我:

  • 在终端A中运行我的事件侦听器脚本
  • 在终端B中的
    /bin/cat
    过程上执行
    kill-9
  • 我的主管日志如下:

    [program:theprogramname]
    command=/bin/cat              ; the program (relative uses PATH, can take args)
    process_name=%(program_name)s ; process_name expr (default %(program_name)s)
    numprocs=1                    ; number of processes copies to start (def 1)
    ...
    [eventlistener:theeventlistenername]
    command=python /home/mickm/listener.py    ; the program (relative uses PATH, can take args)
    process_name=%(program_name)s_%(process_num)s       ; process_name expr (default %(program_name)s)
    numprocs=1                           ; number of processes copies to start (def 1)
    events=PROCESS_STATE                 ; event notif. types to subscribe to (req'd)
    autorestart=true
    redirect_stderr=true
    
    2017-01-13 14:56:36,168 INFO success: theeventlistenername_0 entered RUNNING state, process has stayed up for > than 1 seconds (startsecs)
    2017-01-13 14:56:36,168 INFO success: theprogramname entered RUNNING state, process has stayed up for > than 1 seconds (startsecs)
    2017-01-13 14:57:29,457 INFO exited: theprogramname (terminated by SIGKILL; not expected)
    2017-01-13 14:57:30,460 INFO spawned: 'theprogramname' with pid 25788
    2017-01-13 14:57:31,462 INFO success: theprogramname entered RUNNING state, process has stayed up for > than 1 seconds (startsecs)
    
    虽然主管日志知道我的流程已终止:

    i) 保持“就绪”提示的
    listener.py
    未检测到任何内容

    ii)主管重新开始处理(如预期)

    我想知道为什么侦听器没有为配置文件中定义的程序拾取
    PROCESS\u STATE\u STOPPED
    事件(根据Supervisor事件)。此外-这是否适用于所有主管管理的流程


    谢谢。

    配置变量重定向\u stderr:

    不要在[eventlistener:x]节中设置redirect_stderr=true。 EventListener使用stdout和stdin与Supervisor进行通信。 如果stderr被重定向,来自stderr的输出将干扰 eventlistener协议

    这是我的工作脚本:

    import sys
    
    from supervisor.childutils import listener
    
    def write_stdout(s):
        sys.stdout.write(s)
        sys.stdout.flush()
    
    def write_stderr(s):
        sys.stderr.write(s)
        sys.stderr.flush()
    
    def main():
        while True:
            headers, body = listener.wait(sys.stdin, sys.stdout)
            body = dict([pair.split(":") for pair in body.split(" ")])
    
            write_stderr("Headers: %r\n" % repr(headers))
            write_stderr("Body: %r\n" % repr(body))
    
            if headers["eventname"] == "PROCESS_STATE_STOPPING":
                write_stderr("Process state stopping...\n")
    
            # acknowledge the event
            write_stdout("RESULT 2\nOK")
    
    但是我相信你不能仅仅通过运行你的脚本来测试它。您的supervisorctl.conf文件有一些特殊的环境变量,如事件,手动运行脚本时不会出现这些变量

    如果要测试它,请向侦听器添加一些日志记录:

    [eventlistener:theeventlistenername]
    command=python /home/mickm/listener.py    ; the program (relative uses PATH, can take args)
    process_name=%(program_name)s_%(process_num)s       ; process_name expr (default %(program_name)s)
    numprocs=1                           ; number of processes copies to start (def 1)
    events=PROCESS_STATE           ; event notif. types to subscribe to (req'd)
    autorestart=true
    stderr_logfile=errorlogfile
    stdout_logfile=applogfile
    
    您还可以调试头文件变量,并可以检查接收到的数据

    启用日志记录后,您可以使用stderr_日志文件上的tail-f error.log.path对其进行测试

     Headers: "{'ver': '3.0', 'poolserial': '4', 'len': '71', 'server': 'supervisor', 'eventname': 'PROCESS_STATE_RUNNING', 'serial': '4', 'pool': 'mylistener'}" 
     Body: "{'from_state': 'STARTING', 'processname': 'someprocess', 'pid': '345', 'groupname': 'someprocess'}" 
     Process state running...
    
    当我kil-9时,上面的输出会出现在日志中

    此外,标准输出日志文件将记录此类信息:

    RESULT 2
    OKREADY
    RESULT 2
    OKREADY
    RESULT 2
    OKREADY
    RESULT 2
    OKREADY
    RESULT 2
    OKREADY
    

    您可以重新启动任何supervisorctl进程吗?还是杀了它?并检查是否生成了error.log我知道了,在使用eventlistener时也不要使用redirect\u stderr,检查我的编辑器删除redirct属性时,您必须重新启动整个supervisord服务。在这种情况下,仅进行Supervisorctl更新是不够的。我看不出你已经准备好编写stdout了,我是不是遗漏了什么?你不觉得举个例子很好吗?我们可以简单地复制并粘贴到电脑中。作为一个新手,我需要代码:)