Skip to content
Advertisement

Why upstart service does not stop when sys.exit is called by Python

I set up a Python application as a Linux service using Upstart script.

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

I want to stop the service when sys.exit is called inside the python code due to some exception being caught.

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

As it turns out, sys.exit did terminate the current process, but somehow the service keeps getting respawned. If I run status [service] again and again, it would show the service running every time with a new PID.

Is there a way to kill the service completely within the code?

Advertisement

Answer

The short answer is that it respawns the process whenever it exits because that’s what you told it to do. That’s what the respawn directive is for.

If you want to respawn but not immediately, you can add a post-stop delay.

The “Delay Respawn of a Job” section of the Upstart Cookbook gives this example:

respawn
exec mydaemon
post-stop exec sleep 10

You can modify the sleep to whatever is appropriate for your service.

User contributions licensed under: CC BY-SA
7 People found this is helpful
Advertisement