【问题标题】:Running supervisord in AWS Environment在 AWS 环境中运行 supervisord
【发布时间】:2018-06-03 19:48:36
【问题描述】:

我正在努力在我的弹性 beanstalk 环境中添加 Django Channels,但在配置 supervisord 时遇到了问题。具体来说,在/.ebextensions 我有一个文件channels.config,其中包含以下代码:

container_commands:
  01_copy_supervisord_conf:
    command: "cp .ebextensions/supervisord/supervisord.conf /opt/python/etc/supervisord.conf"
  02_reload_supervisord:
    command: "supervisorctl -c /opt/python/etc/supervisord.conf reload"

通过弹性 beanstalk CLI 在第二条命令中出现此错误并显示以下错误消息:

Command failed on instance. Return code: 1 Output: error: <class 
    'FileNotFoundError'>, [Errno 2] No such file or directory:
    file: /opt/python/run/venv/local/lib/python3.4/site-
    packages/supervisor/xmlrpc.py line: 562.
    container_command 02_reload_supervisord in 
    .ebextensions/channels.config failed.

我的猜测是 supervisor 没有正确安装,但是因为命令 1 复制文件时没有错误,这让我认为 supervisor 确实已安装并且我对容器命令有问题。有没有人在 AWS 环境中实现 supervisor 并且可以看到我哪里出错了?

【问题讨论】:

    标签: django amazon-web-services amazon-elastic-beanstalk supervisord


    【解决方案1】:

    你应该注意python版本和确切的安装路径,

    这就是它可能有帮助的方法

    packages:
      yum:
        python27-setuptools: []
    container_commands:
      01-supervise:
        command: ".ebextensions/supervise.sh"
    

    这里是supervise.sh

    #!/bin/bash
    if [ "${SUPERVISE}" == "enable" ]; then
    
    export HOME="/root"
    export PATH="/sbin:/bin:/usr/sbin:/usr/bin:/opt/aws/bin"
    
    easy_install supervisor
    
    cat <<'EOB' > /etc/init.d/supervisord
    
        # Source function library
        . /etc/rc.d/init.d/functions
    
        # Source system settings
        if [ -f /etc/sysconfig/supervisord ]; then
            . /etc/sysconfig/supervisord
        fi
    
        # Path to the supervisorctl script, server binary,
        # and short-form for messages.
        supervisorctl=${SUPERVISORCTL-/usr/bin/supervisorctl}
        supervisord=${SUPERVISORD-/usr/bin/supervisord}
        prog=supervisord
        pidfile=${PIDFILE-/var/run/supervisord.pid}
        lockfile=${LOCKFILE-/var/lock/subsys/supervisord}
        STOP_TIMEOUT=${STOP_TIMEOUT-60}
        OPTIONS="${OPTIONS--c /etc/supervisord.conf}"
        RETVAL=0
    
        start() {
            echo -n $"Starting $prog: "
            daemon --pidfile=${pidfile} $supervisord $OPTIONS
            RETVAL=$?
            echo
            if [ $RETVAL -eq 0 ]; then
                touch ${lockfile}
                $supervisorctl $OPTIONS status
            fi
            return $RETVAL
        }
    
        stop() {
            echo -n $"Stopping $prog: "
            killproc -p ${pidfile} -d ${STOP_TIMEOUT} $supervisord
            RETVAL=$?
            echo
            [ $RETVAL -eq 0 ] && rm -rf ${lockfile} ${pidfile}
        }
    
        reload() {
            echo -n $"Reloading $prog: "
            LSB=1 killproc -p $pidfile $supervisord -HUP
            RETVAL=$?
            echo
            if [ $RETVAL -eq 7 ]; then
                failure $"$prog reload"
            else
                $supervisorctl $OPTIONS status
            fi
        }
    
        restart() {
            stop
            start
        }
    
        case "$1" in
            start)
                start
                ;;
            stop)
                stop
                ;;
            status)
                status -p ${pidfile} $supervisord
                RETVAL=$?
                [ $RETVAL -eq 0 ] && $supervisorctl $OPTIONS status
                ;;
            restart)
                restart
                ;;
            condrestart|try-restart)
                if status -p ${pidfile} $supervisord >&/dev/null; then
                  stop
                  start
                fi
                ;;
            force-reload|reload)
                reload
                ;;
            *)
                echo $"Usage: $prog {start|stop|restart|condrestart|try-restart|force-reload|reload}"
                RETVAL=2
        esac
    
        exit $RETVAL
        EOB
    
          chmod +x /etc/init.d/supervisord
    
          cat <<'EOB' > /etc/sysconfig/supervisord
        # Configuration file for the supervisord service
        #
        # Author: Jason Koppe <jkoppe@indeed.com>
        #             orginal work
        #         Erwan Queffelec <erwan.queffelec@gmail.com>
        #             adjusted to new LSB-compliant init script
    
        # make sure elasticbeanstalk PARAMS are being passed through to supervisord
        . /opt/elasticbeanstalk/support/envvars
    
        # WARNING: change these wisely! for instance, adding -d, --nodaemon
        # here will lead to a very undesirable (blocking) behavior
        #OPTIONS="-c /etc/supervisord.conf"
        PIDFILE=/var/run/supervisord/supervisord.pid
        #LOCKFILE=/var/lock/subsys/supervisord.pid
    
        # Path to the supervisord binary
        SUPERVISORD=/usr/local/bin/supervisord
    
        # Path to the supervisorctl binary
        SUPERVISORCTL=/usr/local/bin/supervisorctl
    
        # How long should we wait before forcefully killing the supervisord process ?
        #STOP_TIMEOUT=60
    
        # Remove this if you manage number of open files in some other fashion
        #ulimit -n 96000
        EOB
    
          mkdir -p /var/run/supervisord/
          chown webapp: /var/run/supervisord/
    
          cat <<'EOB' > /etc/supervisord.conf
        [unix_http_server]
        file=/tmp/supervisor.sock
        chmod=0777
    
        [supervisord]
        logfile=/var/app/support/logs/supervisord.log
        logfile_maxbytes=0
        logfile_backups=0
        loglevel=warn
        pidfile=/var/run/supervisord/supervisord.pid
        nodaemon=false
        nocleanup=true
        user=webapp
    
        [rpcinterface:supervisor]
        supervisor.rpcinterface_factory = supervisor.rpcinterface:make_main_rpcinterface
    
        [supervisorctl]
        serverurl=unix:///tmp/supervisor.sock
    
        [program:process-ipn-api-gpsfsoft]
        command = -- command that u want to run ---
        directory = /var/app/current/
        user = webapp
        autorestart = true
        startsecs = 0
        numprocs = 10
        process_name = -- process name that u want ---
    
        EOB
    
          # this is now a little tricky, not officially documented, so might break but it is the cleanest solution
          # first before the "flip" is done (e.g. switch between ondeck vs current) lets stop supervisord
          echo -e '#!/usr/bin/env bash\nservice supervisord stop' > /opt/elasticbeanstalk/hooks/appdeploy/enact/00_stop_supervisord.sh
          chmod +x /opt/elasticbeanstalk/hooks/appdeploy/enact/00_stop_supervisord.sh
          # then right after the webserver is reloaded, we can start supervisord again
          echo -e '#!/usr/bin/env bash\nservice supervisord start' > /opt/elasticbeanstalk/hooks/appdeploy/enact/99_z_start_supervisord.sh
          chmod +x /opt/elasticbeanstalk/hooks/appdeploy/enact/99_z_start_supervisord.sh
      fi
    

    PS:您已在 Elasticbeanstalk 环境值中将 SUPERVISE 定义为 Enable 以获取此运行。

    【讨论】:

    • 这很有帮助,但在尝试通过容器命令调用脚本时出现权限错误。 Command failed on instance. Return code: 126 Output: /bin/sh: .ebextensions/supervise.sh: Permission denied.你有解决这个问题的经验吗?
    猜你喜欢
    • 1970-01-01
    • 2021-08-21
    • 2017-09-21
    • 2018-02-25
    • 1970-01-01
    • 1970-01-01
    • 2015-04-09
    • 1970-01-01
    • 2012-07-15
    相关资源
    最近更新 更多