【问题标题】:Monitoring Ruby script, using Monit - Including RVM使用 Monit 监控 Ruby 脚本 - 包括 RVM
【发布时间】:2013-03-29 21:09:00
【问题描述】:

我正在使用 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 使用系统调用 execv 来执行一个程序或一个 脚本。这意味着您不能直接在 start、stop 或 exec 语句。要做到这一点,您必须按照上述方式进行; 启动一个 shell 并在那里发出你的命令。例如:

start program = "/bin/bash -c '我的shell命令&&我的其他 命令'"

【问题讨论】:

    标签: ruby linux bash configuration rvm


    【解决方案1】:

    使用这个:

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

    【讨论】:

    • 我试过这个:start = "/home/william/.rvm/bin/rvm in /home/william/ruby/project do ruby daemonloader.rb start"。不幸的是,现在我收到错误消息“找不到 rvm 安装!”它失败了。 xxxx in yyy do zzz 是做什么的?你能解释一下答案吗?谢谢。
    • 您是否以william 用户身份运行此程序?
    • 现在我也尝试了您的编辑。但是,现在我收到错误消息:/home/william/.monitrc:12: Warning: Program does not exist: 'HOME=/home/william' Error: Could not execute HOME=/home/william 'myserver_1' failed to start(myserver_1 是进程的名称)。我也试过 $HOME 和 $rvm_path,但还是不行。您确定这是定义变量的正确方法吗? (我假设这是你正在做的)鉴于字符串不是 bash 而是一些 AFAIK 未记录的 DSL。如果您能解释 in.....do 语句以及此 DSL 的工作原理,我将不胜感激。谢谢
    • 更新为/usr/bin/env - 应该可以解决程序未找到问题
    【解决方案2】:

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

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

    这对我有用。

    【讨论】:

      【解决方案3】:

      提到 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'"
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2010-11-16
        • 2017-02-19
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多