Monit + RVM + Thin на OSX / Linux - PullRequest
7 голосов
/ 03 мая 2011

После нескольких часов попыток (а также попыток Бога и Bluepill) я решил задать свой вопрос здесь, потому что совершенно не знаю, как решить эту проблему.

У меня есть приложение Rails.Я хочу использовать Thin в качестве сервера приложений.Я хочу использовать Monit для мониторинга моих тонких экземпляров.Я использую RVM для управления своими версиями Ruby в качестве локального пользователя.

У меня настроен следующий файл monit, который предположительно будет делать то, что я хочу, но не:

check process thin-81
  with pidfile /Users/Michael/Desktop/myapp/tmp/pids/thin.81.pid

  start program = "/Users/Michael/.rvm/gems/ruby-1.9.2-p180/bin/thin start -c /Users/Michael/Desktop/myapp -e production -p 81 -d -P tmp/pids/thin.81.pid"
  stop program = "/Users/Michael/.rvm/gems/ruby-1.9.2-p180/bin/thin stop -c /Users/Michael/Desktop/myapp -P tmp/pids/thin.81.pid"

  if totalmem is greater than 150.0 MB for 2 cycles then restart

Если я просто скопирую / вставлю start program в командную строку (за пределами Monit), это сработает.То же самое касается stop program, чтобы потом остановить экземпляр Thin.Однако запуск его через Monit, похоже, не работает.

Запуск в режиме подробного -v дает следующее:

monit: pidfile '/Users/Michael/Desktop/myapp/tmp/pids/thin.81.pid' does not exist

Что заставляет меня поверить, что Thin никогда не инициализируется.Монит работает как root или как?Потому что, если это произойдет, то, очевидно, на нем не будут установлены правильные гемы, так как я использую RVM, а не "системный" Ruby.Я в настоящее время на OSX (но в конечном итоге будет развернут на Linux) - кто-нибудь знает, что может быть причиной этого?И если Monit запускается через root, как я могу заставить его использовать RVM независимо?Или я мог бы попросить Monit выполнить программы запуска / остановки как Michael:staff (я полагаю, это будет в OSX?)

Любая помощь очень ценится!

Ответы [ 3 ]

11 голосов
/ 25 мая 2011

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

/usr/bin/bash -c 'export rvm_path=/home/foo/.rvm; . $rvm_path/scripts/rvm; cd my_ruby_app_path; $rvm_path/bin/rvm rvmrc load; ./my_ruby_app'

как команда запуска monit.

7 голосов
/ 22 ноября 2011

другой вариант, который я нашел в группе Google RVM, выглядит следующим образом:

start program = "/bin/su - myuser -c '/path/to/myscript.rb start' " 

su - пользователь запускает оболочку пользователя как оболочку входа в систему, поэтому если пользовательская оболочка bash, это приведет к запуску ~ / .bash_profile, поэтому переменные среды должны быть такими же, как и после этого пользователя авторизовался.

Нам нужен путь для su, иначе monitrc не сможет найти исполняемый файл su.

4 голосов
/ 20 августа 2011

Лучшим способом было бы использовать оболочку RVM для создания собственного исполняемого файла для thin.Он создаст правильные переменные окружения для использования правильных ruby ​​и gems, а затем запустит thin.Узнайте больше об этом, используя его с богом здесь: https://rvm.io/integration/god/. Он должен работать так же с monit

Для создания оболочки: rvm wrapper ruby@gemset bootup thin

Затем измените start program и stop program чтобы использовать только что созданный исполняемый файл.

...