Я искал, как создать файл pid для мониторинга процессов выскочки в ubuntu. Я просмотрел принятый ответ в Ubuntu, upstart и создал pid для мониторинг и получил следующий код:
env PROGRAM_NAME=myscript
env BASE_PATH=/bar/
respawn limit 5 30
script
${BASE_PATH}/bin/python ${BASE_PATH}/scripts/${PROGRAM_NAME}.py -e ${BASE_PATH}/foo.ini
end script
post-start script
echo PID=`status myscript | egrep -oi '([0-9]+)$' | head -n1`
echo $PID > /var/run/${PROGRAM_NAME}.pid
end script
post-stop script
rm -f /var/run/${PROGRAM_NAME}.pid
end script
Есть 3 проблемы, с которыми я сталкиваюсь:
Каким-то образом этот код создает два процесса. Родительский процесс (проверяется через ps -ef | grep python) — это просто оболочка типа:
/bin/sh -e -c ${BASE_PATH}/bin/python ${BASE_PATH}/scripts/${PROGRAM_NAME}.py -e ${BASE_PATH}/foo.ini /bin/sh
В то время как дочерний процесс имеет правильные замены:
/bar/bin/python /bar/scripts/myscript.py -e /bar/foo.ini
Файл pid содержит pid родителя фактического процесса. Не ребенок тот, который является фактическим процессом.
Респаун не работает. Я убиваю дочерний процесс с помощью
kill pid
(что также убивает родителя, но не наоборот).