【问题标题】:Unable to start a Python app using Supervisord无法使用 Supervisord 启动 Python 应用程序
【发布时间】:2017-04-14 10:16:14
【问题描述】:

我有一个小应用程序,我想开始使用 supervisord。我已经尝试了以下

我的初始 shell 脚本可以通过将 PID 保存在文本文件中来启动和停止 celery 和 Flask 作为守护进程。因为 supervisord 会负责杀死它,所以我去掉了 stop 部分并且不对脚本进行守护。

经过反复试验,这些是我认为有意义但不起作用的脚本和配置二重奏。

1

Shell 脚本

#!/bin/bash


if [[ $1 == "gunicorn" ]]
then
    cd /home/abhirath/Desktop/Hitler
    source env/bin/activate
    python env/bin/gunicorn -b 0.0.0.0:3333 -w 3 gunicornserve:app

elif [[ $1 == "celery" ]]
then
    cd /home/abhirath/Desktop/Hitler
    source env/bin/activate
    python env/bin/celery -A testrunner worker --concurrency=3 --loglevel=info

else
    echo "Usage:-"
    echo "To start celery:-"
    echo "./hitler.sh celery"
    echo "To start Gunicorn"
    echo "./hitler.sh gunicorn"
fi

配置文件

[group:hitler]
programs=gunicorn,celery

[program:gunicorn]
command=/home/abhirath/Desktop/Hitler/hitler.sh gunicorn
stderr_logfile =/home/abhirath/Desktop/supervisor.err.log
autostart=true
autorestart=true
stopasgroup=true
killasgroup=true

[program:celery]
command=/home/abhirath/Desktop/Hitler/hitler.sh celery
stderr_logfile=/home/abhirath/Desktop/supervisor.err2.log
autostart=true
autorestart=true
stopasgroup=true
killasgroup=true

2

没有shell文件

[group:hitler]
programs=gunicorn,celery

[program:gunicorn]
command=source env/bin/activate; python env/bin/gunicorn -b 0.0.0.0:3333 -w 2 gunicornserve:app;
directory=/home/abhirath/Desktop/Hitler

[program:celery]
command=source env/bin/activate; python env/bin/celery -A testrunner worker --concurrency=4 --loglevel=info;
directory=/home/abhirath/Desktop/Hitler

stderr_logfile、autostart、autorestart、stopasgroup、killasgroup 同 #1

我收到一条消息说找不到命令 source。我在同一目录中的终端上尝试了相同的命令,它可以工作。


3

Shell 脚本

#!/bin/bash
    
    
    if [[ $1 == "gunicorn" ]]
    then
        source env/bin/activate
        python env/bin/gunicorn -b 0.0.0.0:3333 -w 3 gunicornserve:app
    
    elif [[ $1 == "celery" ]]
    then
        source env/bin/activate
        python env/bin/celery -A testrunner worker --concurrency=3 --loglevel=info
    
    else
        echo "Usage:-"
        echo "To start celery:-"
        echo "./hitler.sh celery"
        echo "To start Gunicorn"
        echo "./hitler.sh gunicorn"
    fi

会议

[group:hitler]
programs=gunicorn,celery

[program:gunicorn]
command=./hitler.sh gunicorn
directory=/home/abhirath/Desktop/Hitler    

[program:celery]
command=./hitler.sh celery
directory=/home/abhirath/Desktop/Hitler

stderr_logfile、autostart、autorestart、stopasgroup、killasgroup 同 #1


我也尝试过使用 command=bash -c "command here",尽管我觉得在上述所有情况下都不需要它。文档中提到了here

我收到以下错误,但我无法弄清楚原因:-

无法生成

进程退出太快

【问题讨论】:

  • 在#2中你不需要source。您可以使用:command=/path/to/env/bin/gunicorn -b 0.0.0.0:3333 -w 2 gunicornserve:app
  • 注意#3。根据document如果是相对的,将在supervisord的环境$PATH中搜索可执行文件”,表示./hitler.sh是从$PATH搜索的,而不是/home/abhirath/Desktop/Hitler跨度>
  • @ymonad 我不明白那部分。我会请我的同事详细说明这一点。谢谢:)
  • @MohammadAmin 但我需要激活 Python 环境。我不是吗?我会尽力回复你:)
  • @AbhirathMahipal 这意味着如果你想设置command=./hitler.sh,你可能需要添加environment = PATH="/home/abhirath/Desktop/Hitler:/usr/local/bin:/usr/bin:/bin"

标签: python linux flask daemon supervisord


【解决方案1】:

在 #2 的情况下,您实际上不需要激活 virtualenv。您可以将其更改为:

[group:hitler]
programs=gunicorn,celery

[program:gunicorn]
command=/absolute/path/to/env/bin/gunicorn /absolute/path/to/gunicornserve:app -b 0.0.0.0:3333 -w 2
directory=/home/abhirath/Desktop/Hitler

[program:celery]
command=/absolute/path/to/env/bin/celery -A testrunner worker --concurrency=4 --loglevel=info
directory=/home/abhirath/Desktop/Hitler

【讨论】:

  • 我试试看。我可以在它工作后等待一段时间再接受您的回答吗?
  • 当然,但是请为您的问题选择一个答案,以便未来的访问者也可以使用它。谢谢
  • 是的。绝对:)
  • 我收到BACKOFF Exited too quickly。它给出了无法生成进程和could not find module之类的语句
  • 独角兽和芹菜。我还用python /path/to/env/bin/gunicorn ... 尝试过。暂时不要打扰自己,我会先尝试@ymonad的解决方案。
【解决方案2】:

@MohammadAmin 和 @ymonad 给出了我在这个答案中使用的精彩建议。由于这里给出的解释,我找到了一个更简单的解决方案 -> Supervising virtualenv django app via supervisor

脚本文件

#!/bin/bash


if [[ $1 == "gunicorn" ]]
then
  env/bin/python env/bin/gunicorn -b 0.0.0.0:3333 -w 3 gunicornserve:app 

elif [[ $1 == "celery" ]]
then
  export C_FORCE_ROOT='true'
  env/bin/python env/bin/celery -A testrunner worker --concurrency=3 --loglevel=info

else
  echo "Usage:-"
  echo "To start celery:-"
  echo "./hitler.sh celery"
  echo "To start Gunicorn"
  echo "./hitler.sh gunicorn"

fi

由于我将项目目录指定为环境路径,因此无需指定环境中Python解释器的绝对路径。

主管会议

[group:hitler]
programs=gunicorn,celery

[program:gunicorn]
command=bash -c "./hitler.sh gunicorn" 
directory=/home/abhirath/Desktop/Hitler
environment=PATH="/home/abhirath/Desktop/Hitler"
stderr_logfile=/home/abhirath/Desktop/Hitler/Logs/gunicornerr.log
stderr_logfile_backups=1
stdout_logfile=/home/abhirath/Desktop/Hitler/Logs/gunicornout.log
stdout_logfile_backups=1
autostart=true
autorestart=true
stopasgroup=true
killasgroup=true
startretries=0

[program:celery]
command=bash -c "./hitler.sh celery"
directory=/home/abhirath/Desktop/Hitler
environment=PATH="/home/abhirath/Desktop/Hitler"
stderr_logfile=/home/abhirath/Desktop/Hitler/Logs/celeryerr.log
stderr_logfile_backups=1
stdout_logfile=/home/abhirath/Desktop/Hitler/Logs/celeryout.log
stdout_logfile_backups=1
autostart=true
autorestart=true
stopasgroup=true
killasgroup=true
startretries=0

【讨论】:

  • 我认为答案之间没有太大区别。我喜欢用 Pythonic 的方式来做。
  • @MohammadAmin 实际上是的。无论如何,我必须输入相同次数的路径。再次接受您的回答。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多