我使用Monit来监控使用Ruby daemons gem的ruby脚本,该脚本使用PID启动一个单独的进程 - 按照Monitor ruby processes with Monit
的说明进行操作为了执行ruby脚本,我需要在Monit start
和stop
字符串中包含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
添加到start
和stop
命令字符串以尝试包含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 命令“'
答案 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'"