我正在使用 Monit 来监控一个使用Ruby 守护进程 gem的 ruby 脚本,该脚本使用PID 启动一个单独的进程 - 按照Monitor ruby processes with Monit的说明进行操作
为了执行 ruby 脚本,我需要在 Monitstart
和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'"
....
谢谢你的帮助。
编辑
我感觉问题与环境变量有关。从这个页面引用
您还应该知道,出于安全原因,Monit 会清除环境并仅设置一个包含 /bin、/usr/bin、/sbin 和 /usr/sbin 的 spartan PATH 变量。如果您的程序或脚本死机,原因可能是它需要某些环境变量或通过 PATH 找到某些程序。如果是这种情况,您应该直接在 monit 调用的启动或停止脚本中设置所需的环境变量。
最后,Monit 使用系统调用 execv 来执行程序或脚本。这意味着您不能直接在 start、stop 或 exec 语句中编写 shell 命令。要做到这一点,您必须按照上述方式进行;启动一个 shell 并在那里发出你的命令。例如:
start program = "/bin/bash -c '我的 shell 命令 && 我的其他命令'"