7

在尝试了几个小时(也尝试了上帝和 Bluepill)之后,我决定在这里问我的问题,因为我完全不知道如何解决这个问题。

我有一个 Rails 应用程序。我想使用 Thin 作为我的应用服务器。我想使用 Monit 来监控我的 Thin 实例。我使用 RVM 作为本地用户来管理我的 Ruby 版本。

我设置了以下监控文件,它可能会做我想做的事,但不会:

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 上?)

任何帮助深表感谢!

4

3 回答 3

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

于 2011-05-24T23:27:12.227 回答
7

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

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

su - 用户将用户的 shell 作为登录 shell 运行,因此如果用户的 shell 是 bash,它将导致 ~/.bash_profile 运行,因此环境变量应该与该用户登录后的环境变量相同。

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

于 2011-11-22T19:48:50.460 回答
4

更好的方法是使用 RVM 包装器为瘦创建自定义可执行文件。它将创建正确的环境变量以使用正确的 ruby​​ 和 gems,然后启动薄。在此处阅读有关与上帝一起使用它的更多信息:https ://rvm.io/integration/god/ 。它应该与 monit 相同

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

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

于 2011-08-20T07:16:54.553 回答