我有一个 Python 服务器,必须由启用了软件集合的环境执行。supervisord
配置文件如下所示:
[program:xxx]
command=/usr/bin/scl enable rh-python35 -- /myenv/bin/python server.py
stdout_logfile=/var/log/xxx.log
redirect_stderr=true
程序启动正常,但supervisord
认为该scl
进程是实际进程,但Python 服务器有不同的 PID当到达 SIGTERM(停止、重启等)时,scl
进程终止,但 Python 服务器继续运行。
我可以让我的服务器写入一个 PID 文件,然后使用pidproxy
提供的程序supervisord
,如下所述:
http://supervisord.org/subprocess.html#pidproxy-program
然后,如所述,supervisord
将向正确的 PID 发送信号。但是,如果可能的话,我更愿意避免更改服务器代码来创建 PID 文件。
问题:还有其他设置方法吗?
请注意,直接执行python
软件集合内的可执行文件不起作用:
[user@xxx gpsengine]$ /opt/rh/rh-python35/root/bin/python -V
/opt/rh/rh-python35/root/bin/python: error while loading shared libraries: libpython3.5m.so.rh-python35-1.0: cannot open shared object file: No such file or directory
其他详情:
- Centos 7
编辑:除此之外,还有一种pidproxy
涉及中间 shell 脚本的方法。此邮件列表条目描述了一个enable
脚本(相对于scl enable
命令):
https://www.redhat.com/archives/sclorg/2016-June/msg00008.html
它可以在 shell 脚本中使用,如下所示:
exec 2>&1
test -f /opt/rh/rh-python35/enable && source /opt/rh/rh-python35/enable
exec /myenv/bin/python server.py
由于exec
替换了shell进程,supervisord
程序配置就可以指向这个shell脚本作为命令。