经过几个小时的努力(并尝试上帝和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上?)
非常感谢任何帮助!
答案 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 program
和stop program
以使用您刚刚创建的可执行文件。