OSX / Linux上的Monit + RVM + Thin

时间:2011-05-03 00:15:59

标签: ruby rvm thin monit

经过几个小时的努力(并尝试上帝和Bluepill)后,我决定在这里提出我的问题,因为我完全无法解决这个问题。

我有一个Rails应用程序。我想使用Thin作为我的应用服务器。我想使用Monit来监控我的Thin实例。我使用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永远不会初始化。 Monit是root还是什么?因为如果它确实那么它显然不会安装正确的gem,因为我使用RVM而不是“系统”Ruby。我目前在OSX上(但最终将部署到Linux) - 有谁知道这可能是什么原因?如果Monit是通过root运行的,我怎么能让它使用RVM呢?或者我可以告诉Monit以Michael:staff执行启动/停止程序(我假设它将在OSX上?)

非常感谢任何帮助!

3 个答案:

答案 0 :(得分:11)

monit清除环境,也不为命令运行shell(更不用说交互式命令)了。我发现我必须做一些事情:

/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 start命令。

答案 1 :(得分:7)

我在RVM google小组中找到的另一个选项如下:

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

su - user将用户的shell作为登录shell运行,所以如果是 用户的shell是bash,它会导致〜/ .bash_profile运行所以 环境变量应该与该用户之后的相同 登录。

我们需要su的路径,否则,monitrc将无法找到su可执行文件。

答案 2 :(得分:4)

更好的方法是使用RVM包装器为thin创建自定义可执行文件。它将创建正确的环境变量以使用正确的ruby和gem,然后启动thin。阅读更多关于它与神在这里使用它:https://rvm.io/integration/god/。它应该与monit

一样

创建包装器:     rvm wrapper ruby@gemset bootup thin

然后更改start programstop program以使用您刚刚创建的可执行文件。