Monit Ruby on Rails Sidekiq

Я пытаюсь настроить Monit для Sidekiq. Вот что у меня есть для моего конфигурационного файла:

 check process sidekiq_site
  with pidfile /var/www/site/tmp/pids/sidekiq.pid
  start program = "bundle exec sidekiq -C /var/www/site/config/sidekiq.yml -P /var/www/site/tmp/pids/sidekiq.pid" with timeout 90 seconds
  if totalmem is greater than 200 MB for 2 cycles then restart # eating up memory?
  group site_sidekiq

Проблема в том, что при запуске monit reload появляется сообщение о том, что программа "bundle" не существует.

У кого-нибудь есть решение для этого?

6 ответов

Поработав над своим собственным конфигом monit и sidekiq, я могу поделиться тем, что у меня работало под управлением ubuntu.

Во-первых, если вы находитесь в этом дистрибутиве, существует скрипт выскочки sidekiq для Ubuntu. Есть скрипты для sidekiq и для управления работниками: https://github.com/mperham/sidekiq/tree/master/examples/upstart/manage-one

Я столкнулся с несколькими ошибками с этим сценарием upstart по умолчанию, так как я использую rvm. Проверка /var/logs/upstart/sidekiq-0.log проливает свет на проблемы. Эта строка:

exec bin/sidekiq -i ${index} -e production -C config/sidekiq.yml -P tmp/pids/sidekiq-${index}.pid

необходимо изменить на exec bundle exec sidekiq + варианты

Затем, чтобы сохранить все в соответствии с моей установкой rvm, я изменил следующее:

#source $HOME/.rvm/scripts/rvm
source /usr/local/rvm/scripts/rvm

В / etc / monit / monitrc я ссылаюсь на сценарии upstart и имею:

# sidekiq
check process sidekiq
  with pidfile /var/www/apps/myapp/current/tmp/pids/sidekiq-0.pid
  start program = "/usr/bin/sudo start sidekiq index=0"
  stop program = "/usr/bin/sudo stop sidekiq index=0"
  if totalmem is greater than 500 MB for 2 cycles then restart # eating up memory?
  if 3 restarts within 5 cycles then timeout

Проверьте это: https://groups.google.com/forum/?fromgroups=, если вы используете rvm,

/bin/su - <username> -c 'bundle exec sidekiq -C /var/www/site/config/sidekiq.yml -P /var/www/site/tmp/pids/sidekiq.pid'

если вы запускаете monit от пользователя, установите $HOME в вашем.bash_profile.

Или выясните, какой ответ: https://github.com/mperham/sidekiq/issues/506

Вот суть, которую я написал на github:

check process sidekiq_production with pidfile /var/run/sidekiq_production.pid
        depends on redis-server
        start program = "/etc/init.d/sidekiq_production start" with timeout 90 seconds
        stop program = "/etc/init.d/sidekiq_production stop" with timeout 90 seconds
        if totalmem is greater than 200 MB for 2 cycles then restart # eating up memory?
        if 2 restarts within 3 cycles then timeout

Я также написал скрипт инициализации для sidekiq на Debian: https://gist.github.com/alain75007/5517948

Наконец-то это решение сработало для меня как шарм:)

check process sidekiq with pidfile path_to_my_pid_file/sidekiq.pid

start program = "/bin/bash -c 'cd my_app_current && source /home/myuser/.rvm/environments/ruby-2.1.2@global && bundle exec sidekiq -e production -P path_to_my_pid_file/sidekiq.pid -L /my_shared_folder_path/log/sidekiq.log -C my_app_current/config/sidekiq.yml --daemon'" as uid "myuser" and gid "myuser"

stop program = "/bin/bash -c 'kill -s INT `cat path_to_my_pid_file/sidekiq.pid`'" as uid "myuser" and gid "myuser"

** Имейте в виду следующие моменты:**

  • Я использую RVM для управления версиями ruby, пожалуйста, проверьте с помощью rbenv.
  • Здесь вам нужно передать глобальное местоположение ruby ​​так, как я его здесь:- /home/myuser/.rvm/environments/ruby-2.1.2@global

Ваша проблема в том, что пакет команд отсутствует. Я думаю, что вы должны написать конфигурационный файл monit следующим образом:

check process sidekiq 
  with pidfile /srv/www/projects/myapp/shared/log/production.sidekiq.pid
  start program = "/usr/bin/env /usr/bin/env HOME=/home/USER_NAME RACK_ENV=production RAILS_ENV=production PATH=/usr/local/bin:/usr/local/ruby/bin:/usr/bin:/bin:$PATH /bin/sh -l -c 'cd /srv/www/rails/myapp/current; bundle exec sidekiq'" as uid USER_NAME
  stop program = "/usr/bin/env /usr/bin/env HOME=/home/USER_NAME RACK_ENV=production RAILS_ENV=production PATH=/usr/local/bin:/usr/local/ruby/bin:/usr/bin:/bin:$PATH /bin/sh -l -c 'cd /
  group myapp_workers

Если вы зайдете в каталог приложений и позвоните в bundle, я думаю, что это работает.

Вот конфиг, который работает на Ubuntu с rvm

check process sidekiq-th with pidfile /web/vcms/tmp/pids/sidekiq.pid
   start program = "/home/dimon/.rvm/bin/rvm-shell -c '/web/vcms/sidekiq.sh start'"
   stop program = "/bin/bash /web/vcms/sidekiq.sh stop &"   

Он использует скрипт, основные строки

Начните

cd /web/vcms; sidekiq -d -e production &

и остановиться

sidekiqctl stop $PIDFILE

Я не гуру по написанию скриптов и буду благодарен за любой совет =)

Другие вопросы по тегам