3

我正在尝试在我的 Flask 应用程序所需的弹性 beantalk 上运行一个huey任务队列。但是没有内置的方式将huey作为守护进程运行。huey 的作者建议使用supervisor运行 huey (此链接),并且由于弹性 beanstalk 已经使用了 supervisor,我认为我们可以添加由 supervisor 管理的程序。但我不确定如何以编程方式执行此操作。目前,我正在使用配置文件中的container_commands( ref link ) 键来运行它,但是弹性 beanstalk 在一段时间后在前台运行时给了我一个超时错误。下面是我正在使用的配置文件。

packages:
  yum:
    gcc: []
    gcc-c++: []
    gcc-gfortran: []
    htop: []
    make: []
    wget: []
    atlas-devel: []
    lapack-devel: []
commands:
  01enable_swap:
    command:
      - sudo dd if=/dev/zero of=/var/swap1 bs=1M count=1024
      - sudo mkswap /var/swap1
      - sudo chmod 644 /var/swap1
      - sudo swapon /var/swap1
    cwd: /home/ec2-user
  02install_redis:
    command:
      - wget "http://download.redis.io/redis-stable.tar.gz"
      - tar -xvzf redis-stable.tar.gz
      - rm redis-stable.tar.gz
      - cd redis-stable
      - sudo make
      - sudo make install
    cwd: /home/ec2-user
container_commands:
  01download_nltk_packages:
    command: "python install_resources.py"
  02run_redis:
    command: "redis-server --host 127.0.0.1 --port 6379 --daemonize yes"
  03run_huey:
    command: "huey_consumer jupiter.huey"

这是我想要实现的目标:
1. 部署我的 Flask 应用程序时,huey 应该作为后台进程运行。
2.主管应处理huey进程的自动启动/停止。

4

1 回答 1

0

我通过在名为002_supervisor.conf. 这适用于 django,但我确信它可以适用于烧瓶。

  1. 创建主管配置文件
  2. 创建主管 init.d 文件
  3. 创建一个由主管加载的 huey.conf 文件
文件:
   /usr/local/etc/supervisord.conf:
    模式:“000755”
    所有者:根
    组:根
    内容:|
        [unix_http_server]
        文件=/tmp/supervisor.sock ; (套接字文件的路径)

        [监督]
        日志文件=/tmp/supervisord.log;(主日志文件;默认 $CWD/supervisord.log)
        pidfile=/tmp/supervisord.pid ; (supervisord pidfile;默认 supervisord.pid)
        节点守护进程=假;(如果为真则在前台开始;默认为假)

        [rpc接口:主管]
        supervisor.rpcinterface_factory = supervisor.rpcinterface:make_main_rpcinterface

        [supervisorctl]
        serverurl=unix:///tmp/supervisor.sock ; 对 unix 套接字使用 unix:// URL

        [包括]
        文件 = /usr/local/etc/*.conf

        [inet_http_server]
        端口 = 127.0.0.1:9001
   /etc/init.d/supervisord:
    模式:“000755”
    所有者:根
    组:根
    内容:|
        #!/bin/bash

        # 源函数库
        . /etc/rc.d/init.d/functions

        # 源系统设置
        如果 [ -f /etc/sysconfig/supervisord ]; 然后
            . /etc/sysconfig/supervisord
        菲

        # supervisorctl 脚本的路径,服务器二进制文件,
        # 和消息的简写形式。
        supervisorctl=/usr/local/bin/supervisorctl
        supervisord=${SUPERVISORD-/usr/local/bin/supervisord}
        prog=主管
        pidfile=${PIDFILE-/tmp/supervisord.pid}
        lockfile=${LOCKFILE-/var/lock/subsys/supervisord}
        STOP_TIMEOUT=${STOP_TIMEOUT-60}
        OPTIONS="${OPTIONS--c /usr/local/etc/supervisord.conf}"
        RETVAL=0

        开始() {
            echo -n $"开始 $prog:"
            守护进程 --pidfile=${pidfile} $supervisord $OPTIONS
            RETVAL=$?
            回声
            如果 [ $RETVAL -eq 0 ]; 然后
                触摸 ${lockfile}
                $supervisorctl $OPTIONS 状态
            菲
            返回 $RETVAL
        }

        停止() {
            echo -n $"停止 $prog:"
            killproc -p ${pidfile} -d ${STOP_TIMEOUT} $supervisord
            RETVAL=$?
            回声
            [ $RETVAL -eq 0 ] && rm -rf ${lockfile} ${pidfile}
        }

        重载(){
            echo -n $"重新加载 $prog:"
            LSB=1 killproc -p $pidfile $supervisord -HUP
            RETVAL=$?
            回声
            如果 [ $RETVAL -eq 7 ]; 然后
                失败 $"$prog 重新加载"
            别的
                $supervisorctl $OPTIONS 状态
            菲
        }

        重新开始() {
            停止
            开始
        }

        案例“$1”在
            开始)
                开始
                ;;
            停止)
                停止
                ;;
            地位)
                状态 -p ${pidfile} $supervisord
                RETVAL=$?
                [ $RETVAL -eq 0 ] && $supervisorctl $OPTIONS 状态
                ;;
            重新开始)
                重新开始
                ;;
            condrestart|尝试重启)
                如果状态 -p ${pidfile} $supervisord >&/dev/null; 然后
                  停止
                  开始
                菲
                ;;
            强制重新加载|重新加载)
                重新加载
                ;;
            *)
                echo $"用法:$prog {start|stop|restart|condrestart|try-restart|force-reload|reload}"
                RETVAL=2
            经社理事会

            退出 $RETVAL
   “/opt/elasticbeanstalk/hooks/appdeploy/post/run_supervised_huey.sh”:
    模式:“000755”
    所有者:根
    组:根
    内容:|
      #!/usr/bin/env bash

      # 获取django环境变量
      env=`cat /opt/python/current/env | tr '\n' ',' | sed 's/export //g' | sed 's/$PATH/%(ENV_PATH)s/g' | sed 's/$PYTHONPATH//g' | sed 's/$LD_LIBRARY_PATH//g' | sed 's/%/%%/g'`
      环境=${环境%?}

      # 创建huey配置脚本
      hueyconf="[程序:huey]
      ; 如果使用 virtualenv,则设置 celery 程序的完整路径
      命令=/opt/python/current/app/production.py run_huey
      用户=无人
      numprocs=1
      stdout_logfile=/var/log/huey.log
      stderr_logfile=/var/log/huey.log
      自动启动=真
      自动重启=真
      开始秒=10

      ; 需要等待当前正在执行的任务在关机时完成。
      ; 如果您有很长时间运行的任务,请增加此值。
      停止等待秒 = 60

      ; 当诉诸向程序发送 SIGKILL 以终止它时
      ; 将 SIGKILL 发送到其整个进程组,
      ; 还要照顾它的孩子。
      killasgroup=真
      环境=$env"

      # 创建 celery supervisord 配置脚本
      回声“$hueyconf”| 三通 /usr/local/etc/huey.conf

      # 更新缓存中的supervisord而不重启所有服务
      /usr/local/bin/supervisorctl 重读
      /usr/local/bin/supervisorctl 更新

      # 通过supervisord启动/重启huey
      /usr/local/bin/supervisorctl -c /usr/local/etc/supervisord.conf 重启huey

命令:
  01_start_supervisor:
    命令:'/etc/init.d/supervisord 重启'
    仅领导者:真

于 2018-09-06T20:29:56.770 回答