为什么Python调用sys.exit时upstart服务不会停止

时间:2018-08-16 02:44:54

标签: python linux upstart system-services

我使用Upstart脚本将Python应用程序设置为Linux服务。

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

由于要捕获某些异常,我想在python代码内部调用sys.exit时停止服务。

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

事实证明,sys.exit确实终止了当前进程,但是不知何故该服务不断产生。如果我一次又一次运行status [service],它将显示每次使用新PID运行的服务。

是否有一种方法可以完全在代码中终止服务?

1 个答案:

答案 0 :(得分:0)

简短的回答是,它在退出时都会重新生成该进程,因为这就是您要求它执行的操作。这就是respawn指令的用途。

如果您想重生但不立即重生,则可以添加停止后延迟。

"Delay Respawn of a Job" section of the Upstart Cookbook给出了以下示例:

respawn
exec mydaemon
post-stop exec sleep 10

您可以将睡眠时间更改为适合您的服务的时间。