在尝试了几个小时(也尝试了 God 和 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
或其他方式运行?因为如果确实如此,那么显然不会安装正确的 gems,因为我使用的是 RVM 而不是“系统”Ruby。我目前在 OSX 上(但最终会部署到 Linux)——有人知道这可能是什么原因吗?如果 Monit 是通过 root 运行的,我怎么能让它使用 RVM 呢?或者我可以告诉 Monit 以 Michael:staff
的身份执行启动/停止程序(我假设它会在 OSX 上?)
非常感谢任何帮助!
最佳答案
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 启动命令。
关于ruby - OSX/Linux 上的 Monit + RVM + Thin,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5863815/