使用Monit监控Ruby脚本 - 包括RVM

时间:2013-04-07 21:26:17

标签: ruby linux bash configuration rvm

我使用Monit来监控使用Ruby daemons gem的ruby脚本,该脚本使用PID启动一个单独的进程 - 按照Monitor ruby processes with Monit

的说明进行操作

为了执行ruby脚本,我需要在Monit startstop字符串中包含RVM,这样我就可以访问所有的gem。

但是当.monitrc执行时,我收到以下错误:

$rvm_path (/usr/local/rvm) does not exist./home/william/.rvm/scripts/rvm: line 174: rvm_is_a_shell_function: command not found
/home/william/.rvm/scripts/rvm: line 185: __rvm_teardown: command not found
'myserver_1' failed to start
Aborting event

我将PATH=$PATH:/home/william/.rvm/bin && . /home/william/.rvm/scripts/rvm添加到startstop命令字符串以尝试包含RVM。但是它仍然不起作用

配置文件.monitrc

....

check process myserver_1
  with pidfile /home/william/ruby/barclays/myapp.rb.pid
  start = "/bin/bash -c 'PATH=$PATH:/home/william/.rvm/bin && . /home/william/.rvm/scripts/rvm && ruby /home/william/ruby/barclays/daemonloader.rb start'"
  stop = "/bin/bash -c 'PATH=$PATH:/home/william/.rvm/bin && . /home/william/.rvm/scripts/rvm && ruby /home/william/ruby/barclays/daemonloader.rb stop'"

  ....

感谢您的帮助。

修改

我感觉问题与环境变量有关。引自this page

  

你应该知道,出于安全考虑,Monit会清除   环境并且只设置包含/ bin的spartan PATH变量,   / usr / bin,/ sbin和/ usr / sbin。如果你的程序或脚本死了,那么   原因可能是它期望某些环境变量或   通过PATH找到某些程序。如果是这种情况,你应该设置   您需要直接在启动或停止脚本中使用的环境变量   由monit召集。

     

最后,Monit使用系统调用execv来执行程序或   脚本。这意味着您无法直接编写shell命令   开始,停止或执行语句。要做到这一点,你必须这样做;   启动一个shell并在那里发出命令。例如:

     

启动program =“/ bin / bash -c'我的shell命令&& my other   命令“'

3 个答案:

答案 0 :(得分:3)

使用此:

/path/to/rvm/bin/rvm in /path/to/project do ...

用rvm和project的正确目录替换路径,用命令停止/启动... - 尝试:

/usr/bin/env "HOME=/home/william rvm_path=/home/william/.rvm 
  /home/william/.rvm/bin/rvm in /home/william/ruby/project do
  ruby daemonloader.rb start"

此命令将RVM cd加载到项目路径中,为此ruby加载ruby并执行给定命令。

答案 1 :(得分:0)

你可以在Monit尝试这样的事情。

start = "/bin/su - william -c 'cd /home/william/ruby/project && ~/.rvm/bin/rvm default do bundle exec ruby daemonloader.rb start'"

这对我有用。

答案 2 :(得分:0)

提及宝石和红宝石源为我解决了这个问题。

start program = "/bin/bash -c 'cd /home/project_path && source /home/user/.rvm/environments/ruby-2.4.2@global && RAILS_ENV=production bundle exec rails s'"