【发布时间】:2013-03-29 21:09:00
【问题描述】:
我正在使用 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 使用系统调用 execv 来执行一个程序或一个 脚本。这意味着您不能直接在 start、stop 或 exec 语句。要做到这一点,您必须按照上述方式进行; 启动一个 shell 并在那里发出你的命令。例如:
start program = "/bin/bash -c '我的shell命令&&我的其他 命令'"
【问题讨论】:
标签: ruby linux bash configuration rvm