【问题标题】:Why upstart service does not stop when sys.exit is called by Python为什么python调用sys.exit时upstart服务不停止
【发布时间】:2019-01-22 22:25:30
【问题描述】:

我使用 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 运行的服务。

有没有办法在代码中完全终止服务?

【问题讨论】:

  • 如果您不希望服务自动重生,可以删除respawn 指令。
  • @DanielPryden 不是马上重生,有没有办法等待一段时间再重生?

标签: python linux upstart system-services


【解决方案1】:

简短的回答是,只要进程退出,它就会重新生成进程,因为这是您告诉它要做的。这就是 respawn 指令的用途。

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

"Delay Respawn of a Job" section of the Upstart Cookbook 给出了这个例子:

respawn
exec mydaemon
post-stop exec sleep 10

您可以将睡眠修改为适合您的服务的任何内容。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-10-28
    • 1970-01-01
    • 2015-01-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多