子shell

时间:2015-09-30 11:37:47

标签: python bash supervisord

我正在编写一个supervisor事件监听器,它可以将进程状态事件发送到队列中以进行进一步处理。事件监听器是用Python编写的,我们称之为handler.py。我有一个用于Python的内部构建和发布系统,它允许我在使用无所不在的bash脚本(称为launcher.sh)从我的任何服务器执行Python脚本之前创建虚拟环境,该脚本基本上看起来像这样

...
create virtualenv
activate virtualenv
python -m main_module

然后我在我的管理程序实例中配置事件监听器,如下所示:

[eventlistener:feedback]
command = launcher.sh handler.py
events=PROCESS_STATE

我可以看到处理程序打印READY \ n到它的标准输出,但没有任何事件传播到它,最终主管开始抱怨溢出的事件缓冲区。如果我然后更改事件监听器配置以直接调用python,就像这样,事情变得生动起来。

[eventlistener:feedback]
command = <path to virtualenv>/bin/python handler.py
events=PROCESS_STATE

我尝试的一件事是使用launcher.sh中的exec调用python,我可以看到没有子进程以这种方式生成,但它仍然不起作用。我想知道这是否与stdout写入的缓冲或类似的事情有关,但我在这个深度的知识是有限的。非常感谢任何帮助。

1 个答案:

答案 0 :(得分:0)

要回答我自己的问题,通过阅读管理员代码,它结果是检查stdout_text.startswith('READY')所以我必须确保我的launcher.sh脚本在启动事件处理程序之前没有打印任何内容