Почему сервис upstart не останавливается, когда Python вызывает sys.exit

Я настроил приложение Python как службу Linux, используя скрипт Upstart.

description "AAE client app"

start on runlevel [2345]
stop on runlevel [!2345]

respawn

env PATH=/home/ec2-user/aae_client/env/bin
env PROGRAM_NAME="aae"
env USERNAME="ec2-user"

# Main script to be run
script
    echo "[`date -u +%Y-%m-%dT%T.%3NZ`] (sys) Ready to run..." >> /var/log/$PROGRAM_NAME.sys.log

    export HOME="/home/ec2-user"
    echo $$ > /var/run/$PROGRAM_NAME.pid

    cd /home/ec2-user/aae_client
    exec python -m app.run >> /var/log/$PROGRAM_NAME.sys.log 2>&1
end script

Я хочу остановить службу, когда sys.exit вызывается внутри кода Python из-за перехвата некоторого исключения.

if not config_path:
    logger.error('Environment variable AAE_CLIENT_CONFIG_PATH is not set')
    sys.exit()

Как выясняется, sys.exit действительно завершил текущий процесс, но каким-то образом сервис продолжает возрождаться. Если я бегу status [service] снова и снова будет отображаться служба, запущенная каждый раз с новым PID.

Есть ли способ полностью убить службу в коде?

1 ответ

Решение

Короткий ответ: он запускает процесс всякий раз, когда завершается, потому что это то, что вы сказали ему делать. Вот что respawn Директива для.

Если вы хотите возродиться, но не сразу, вы можете добавить задержку после остановки.

Раздел "Задержка повторного вызова задания" Поваренной книги Upstart дает следующий пример:

respawn
exec mydaemon
post-stop exec sleep 10

Вы можете изменить сон так, как вам удобно.

Другие вопросы по тегам