遇到了 Supervisord 的其他问题。
Centos 6.5 主管安装 python 2.6,操作系统 python 2.7 安装在 /usr/local/bin 中
Supervisord 程序设置
[program:inf_svr]
process_name=inf_svr%(process_num)s
directory=/opt/inf_api/
environment=USER=root,PYTHONPATH=/usr/local/bin/
command=python2.7 /opt/inf_api/inf_server.py --port=%(process_num)s
startsecs=2
user=root
autostart=true
autorestart=true
numprocs=4
numprocs_start=8080
stderr_logfile = /var/log/supervisord/tornado-stderr.log
stdout_logfile = /var/log/supervisord/tornado-stdout.log
我可以使用以下命令运行 inf_server.py:
python2.7 inf_server.py --port=8080
没问题。我确定这些文件是可执行的(这是我以前遇到的问题)。
有什么想法吗?
更新: 我甚至无法让它启动一个基本的 Python 脚本而不失败。首先注释掉旧程序,添加一个新程序,然后输入:
command=python /opt/inf_api/test.py
其中 test.py 只是将一些内容写入屏幕和文件。失败并显示退出状态 0。因此我开始重新添加 python 的位置(在使用“which python”发现它之后)
environment=PYTHONPATH=/usr/bin
尝试将路径放在单引号中,尝试将 USER=root 添加到环境中,尝试添加
directory=opt/inf_api/
尝试添加
user=root
全部相同,退出状态 0。除了我从 Supervisord 的调试中看到的内容外,似乎没有任何内容添加到任何日志文件中。
哥们,我很茫然。
更新2: 因此,stderr 和 std out 日志中绝对没有任何内容。它只是失败(退出状态 1;非预期),我尝试运行的程序没有任何错误,什么都没有……
2014-03-05 11:25:01,027 INFO spawned: 'inf_svr' with pid 15542
2014-03-05 11:25:01,315 INFO exited: inf_svr (exit status 1; not expected)
2014-03-05 11:25:01,315 INFO received SIGCLD indicating a child quit
更新 3: 我有一个简单的 python 脚本,由 Supervisord 使用 /usr/local/bin/python 2.7 启动和管理,所以至少我知道它可以使用传递的不同版本的 python 进行调用。
然而,我在原始脚本上仍然收到(错误状态 1,非预期)。
我在脚本开头添加了一些异常日志,甚至只是一些打印到文件行。它好像根本就没到那里,甚至在启动之前就失败了。
答案1
事实证明,这是 Supervisord 如何从 Python 捕获错误消息的问题。因为它不是。我运行它来启动一个 tornado 应用程序,它调用第二个 Python 文件,以便它可以生成 n 个 tornado 服务器实例。如果第二个 Python 应用程序中有错误,那么它就不会捕获它们并将它们保存到日志文件中。我尝试了各种方法,但最终不得不自己用 try: except: 捕获它们并将其保存到我自己的日志文件中。无论如何,这可能是一种很好的做法,但谈论一种迂回的方法。