У меня есть среда Elasti c Beanstalk, которая включает в себя приложение Ruby on Rails и Sidekiq Worker.
Для перезапуска Sidekiq во время eb deploy
сборки у меня есть хук после развертывания, который сгенерирован с ebextension.
Хук пост-развертывания выглядит следующим образом:
#!/usr/bin/env bash
. /opt/elasticbeanstalk/support/envvars
EB_APP_DEPLOY_DIR=$(/opt/elasticbeanstalk/bin/get-config container -k app_deploy_dir)
EB_APP_PID_DIR=$(/opt/elasticbeanstalk/bin/get-config container -k app_pid_dir)
EB_APP_USER=$(/opt/elasticbeanstalk/bin/get-config container -k app_user)
EB_SCRIPT_DIR=$(/opt/elasticbeanstalk/bin/get-config container -k script_dir)
EB_SUPPORT_DIR=$(/opt/elasticbeanstalk/bin/get-config container -k support_dir)
. $EB_SUPPORT_DIR/envvars
. $EB_SCRIPT_DIR/use-app-ruby.sh
SIDEKIQ_PID=$EB_APP_PID_DIR/sidekiq.pid
SIDEKIQ_CONFIG=$EB_APP_DEPLOY_DIR/config/sidekiq.yml
. /opt/elasticbeanstalk/support/envvars.d/sysenv
sleep 10
cd $EB_APP_DEPLOY_DIR
echo "starting sidekiq"
su -s /bin/bash -c "bundle exec sidekiq \
-e $RACK_ENV \
-P $SIDEKIQ_PID \
-C $SIDEKIQ_CONFIG 2>&1 | logger -t sidekiq-$RACK_ENV & disown" $EB_APP_USER
Я пытаюсь перенаправить Sidekiq
журналы на syslog
через logger
.
Когда IS SH в экземпляр и вручную запустить скрипт с sudo /opt/elasticbeanstalk/hooks/appdeploy/post/50_restart_sidekiq.sh
, он успешно запускает Sidekiq
и освобождает оболочку.
Но когда я развертываю приложение через eb deploy
, оно застревает после запуска Sidekiq
и не завершает sh, завершая этот хук.
Это последняя строка в eb-activity.log
:
[2020-04-06T11:52:16.708Z] INFO [14255] - [Application update app-297d-200406_145059-stage-200406_145059@124/AppDeployStage1/AppDeployPostHook/50_restart_sidekiq.sh] : Starting activity...
Если я вручную уничтожу процесс Sidekiq
с помощью kill -TERM SIDEKIQ_PID
, крючки отклеятся и продолжат отмечать развертывание как успешное.
Это не возникало проблем, пока я не перенаправил журналы на syslog
.
Мое лучшее предположение, что это как-то связано с тем, как я передаю STDOUT
в логгер, или с тем, как я отрекаюсь от процесса выпуска оболочки во время выполнения перехвата.
Для записи я также попробовал это без отключения:
su -s /bin/bash -c "bundle exec sidekiq \
-e $RACK_ENV \
-P $SIDEKIQ_PID \
-C $SIDEKIQ_CONFIG 2>&1 | logger -t sidekiq-$RACK_ENV &" $EB_APP_USER
, а также попытался добавить exit 0
в конце.
Any Помощь будет принята с благодарностью.