Как автоматически запустить посредник настройки посредника и другие фоновые задания после развертывания на AWS EB? - PullRequest
0 голосов
/ 07 мая 2019

У меня есть приложение Symfony, которое использует Enqueue Bundle для фоновых команд, и я развертываю его в AWS elastaic beanstalk. Теперь я хочу запустить команду enqueue broker вместе со всеми другими командами enqueue в фоновом режиме сразу после развертывания (после развертывания).

То, что я делаю прямо сейчас, это то, что я просто создаю сценарий оболочки, который создает новый /etc/init.d сервис, который используется для запуска / остановки / состояния команды на основе команды PID.

Добавляя новую команду к .ebextensions/files.config

"/opt/elasticbeanstalk/hooks/appdeploy/post/02_start_my_command_service.sh":
              mode: "000755"
              owner: root
              group: root
              content: |
                  #!/bin/bash
                  /var/www/html/bin/my-command-service.sh

и my-command-service.sh - это сценарий оболочки, отвечающий за создание и запуск my-command-service

#!/bin/bash


COMMAND='php /var/app/current/bin/console my:command'
LOG_DIR='/var/log/my-command'
LOG_FILE='/var/log/my-command/log.log'
LOCK_FILE='/var/lock/subsys/my'
PID_FILE='/var/app/current/bin/my_pid.txt'

SERVICE_NAME='myCommand'
SERVICE_LOG_NAME='My_Command'
SERVICE_INSTALLATION_LOG_NAME='MY_COMMAND'


echo "#$SERVICE_INSTALLATION_LOG_NAME# Creating log directory"
echo

mkdir -p $LOG_DIR
touch $LOG_FILE

echo "#$SERVICE_INSTALLATION_LOG_NAME# Creating service"
echo

cat > /etc/rc.d/init.d/$SERVICE_NAME << EOF
#!/bin/bash
#
# /etc/rc.d/init.d/$SERVICE_NAME
#
# chkconfig: 345 70 30
# description: Runs $SERVICE_NAME command
# processname: $SERVICE_NAME

### BEGIN INIT INFO
# Provides: $SERVICE_NAME
# Required-Start: $local_fs $network
# Required-Stop: $local_fs $network
# Should-Start:
### END INIT INFO

# Source function library.
. /etc/rc.d/init.d/functions

case "\$1" in
    start)
        echo -e "($SERVICE_LOG_NAME) - Service is starting..\n"
        echo -e "($SERVICE_LOG_NAME) - Creating lockfile\n"
        touch $LOCK_FILE
        echo -e "($SERVICE_LOG_NAME) - Running command and directing output to $LOG_FILE\n"
        nohup $COMMAND &>$LOG_FILE &
        echo \$! > $PID_FILE
        echo -e "($SERVICE_LOG_NAME) - Disowning this process from the current session\n"
        disown
        echo
    ;;
    stop)
        echo -e "($SERVICE_LOG_NAME) - Service is running..\n"
        echo -e "($SERVICE_LOG_NAME) - Killing command process id\n"
        kill -9 \`cat $PID_FILE\`
        echo -e "($SERVICE_LOG_NAME) - Removing PID file\n"
        rm -f $PID_FILE
        echo -e "($SERVICE_LOG_NAME) - Removing lockfile\n"
        rm -f $LOCK_FILE
    ;;
    status)
        if [ -s $PID_FILE ]
        then
            echo -e "Command is running on PID \$(cat $PID_FILE)\n"
            echo -e "Check command logs by reading this file $LOG_FILE\n"
        else
            echo -e "Command is not running, PID file was not found in here $PID_FILE\n"
        fi
        echo
    ;;
    restart)
    ;;
    reload)
    ;;
    probe)
    ;;
    *)
        echo "Usage: $SERVICE_NAME {start|stop|status|reload|restart[|probe]"
        exit 1
    ;;
esac
EOF

chmod +x /etc/rc.d/init.d/$SERVICE_NAME
chkconfig --add $SERVICE_NAME
service $SERVICE_NAME start

echo "#$SERVICE_INSTALLATION_LOG_NAME# Created service was done"

Теперь, хотя это прекрасно работает и создает новый сервис myCommand, который я могу запустить и управлять им следующим образом service myCommand start|stop|status

Но я чувствую, что чрезмерно усложняю проблему, потому что для каждой команды, которая мне нужна для запуска в фоновом режиме, я должен выполнить те же самые шаги, чтобы создать свой собственный сервис.

Так есть ли лучший способ сделать это? запускать фоновые задания автоматически после развертывания в AWS EB?

...