Eu tenho um servidor Python que deve ser executado por um ambiente habilitado para Coleções de software. O arquivo supervisord config é parecido com isto:
[program:xxx]
command=/usr/bin/scl enable rh-python35 -- /myenv/bin/python server.py
stdout_logfile=/var/log/xxx.log
redirect_stderr=true
O programa é iniciado corretamente, mas supervisord acha que o processo scl é o processo real, mas o servidor Python tem um PID diferente. Quando chegar a hora de SIGTERM (parar, reiniciar, etc.), o processo scl é finalizado, mas o servidor Python continua em execução.
Eu poderia fazer meu servidor gravar um arquivo PID e, em seguida, usar o programa pidproxy fornecido por supervisord , conforme descrito aqui:
Em seguida, conforme descrito, supervisord enviaria sinais para o PID correto. No entanto, eu preferiria, se possível, evitar alterar o código do servidor para criar um arquivo PID.
Observe que a execução direta do executável python dentro da coleção de software não funciona:
[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
Outros detalhes:
EDIT: Existe uma abordagem adicional além de pidproxy , que envolve um shell script intermediário. Esta entrada da lista de discussão descreve um enable script (em oposição ao comando scl enable ):
Isso pode ser usado dentro de um script de shell da seguinte forma:
exec 2>&1
test -f /opt/rh/rh-python35/enable && source /opt/rh/rh-python35/enable
exec /myenv/bin/python server.py
Como exec substitui o processo de shell, a configuração do programa supervisord pode apontar para esse script de shell como o comando.
Tags python centos supervisord scl