У меня есть приложение 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?