supervisord 事件监听器

6 投票
2 回答
7488 浏览
提问于 2025-04-17 17:09

我正在尝试为 supervisord 配置一个事件监听器,但一直没能成功。
我只是想监听 PROCESS_STATE 的变化,然后运行一些 Python 代码来触发一个 urllib2 请求。

在我的 .conf 文件中,我写了:

[eventlistener:statechanges]
command=python listener.py
events=PROCESS_STATE

然后在 listener.py 文件中,我写了:

def run():    
    runFunc() # Function to trigger an urllib2request

if __name__ == '__main__':
    run()

但是触发器没有启动,它在尝试几次后就进入了 FATAL 状态。

statechanges entered FATAL state, too many start retries too quickly

有没有什么想法,或者有人能给我一个如何为 supervisord 编写监听器的例子吗?

2 个回答

0

在ash中:

command=sh -c 'echo "READY"; while read -r line; do echo "$line"; supervisorctl shutdown; done'
6

你不能随便打印一些随机的字符串,因为 supervisord 会监听标准输出哦 :)

来看一下文档里的这个例子:

import sys

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 1:
        write_stdout('READY\n') # transition from ACKNOWLEDGED to READY
        line = sys.stdin.readline()  # read header line from stdin
        write_stderr(line) # print it out to stderr
        headers = dict([ x.split(':') for x in line.split() ])
        data = sys.stdin.read(int(headers['len'])) # read the event payload
        write_stderr(data) # print the event payload to stderr
        write_stdout('RESULT 2\nOK') # transition from READY to ACKNOWLEDGED

if __name__ == '__main__':
    main()
    import sys

http://supervisord.org/events.html#example-event-listener-implementation

撰写回答