7

我正在使用 Monit 来监控一个使用Ruby 守护进程 gem的 ruby​​ 脚本,该脚本使用PID 启动一个单独的进程 - 按照Monitor ruby​​ processes with Monit的说明进行操作

为了执行 ruby​​ 脚本,我需要在 Monitstartstop字符串中包含 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/rvmstartstop命令字符串以尝试包含 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 命令 && 我的其他命令'"

4

3 回答 3

3

用这个:

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

将路径替换为 rvm 和项目的正确目录以及...停止/启动命令 - 尝试:

/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​​ 并执行给定的命令。

于 2013-04-08T01:15:51.090 回答
0

提到 gemset 和 ruby​​ 源代码为我解决了这个问题。

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'"
于 2020-09-04T17:48:47.880 回答
0

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

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

这对我有用。

于 2016-06-23T23:25:42.407 回答