2

我使用 Jruby 和 puma 作为 Web 服务器设置了 Rails 应用程序。Puma 不会自行守护进程,因此我将其包装在 bash 脚本中以处理生成 pid(如 Monit FAQ 中所述)。脚本如下:

#!/bin/bash
APP_ROOT="/home/user/public_html/app"
export RAILS_ENV=production
export JRUBY_OPTS="--1.9"
export PATH=/home/user/.rbenv/shims:/home/user/.rbenv/bin:$PATH
 case $1 in
    start)
       echo $$ > $APP_ROOT/puma.pid;
       cd $APP_ROOT;
       exec 2>&1 puma -b tcp://127.0.0.1:5000 1>/tmp/puma.out 
       ;;
     stop)  
       kill `cat $APP_ROOT/puma.pid` ;;
     *)  
       echo "usage: puma {start|stop}" ;;
 esac
 exit 0

这可以从命令行工作,即使我在运行以下命令以模拟 monit shell 后执行它也可以工作:

env -i PATH=/bin:/usr/bin:/sbin:/usr/sbin /bin/sh

相关的监控行如下:

check process puma with pidfile /home/user/public_html/app/puma.pid
start program = "/usr/bin/env PATH=/home/user/.rbenv/shims:/home/user/.rbenv/bin:$PATH /home/user/puma.sh start"
stop program = "/usr/bin/env PATH=/home/user/.rbenv/shims:/home/user/.rbenv/bin:$PATH /home/user/puma.sh stop"

监控日志显示它不断尝试启动 puma,甚至可以重新生成新的 PID,但永远无法真正启动 puma。每次我尝试从其他所有上下文运行此脚本时,我都认为它有效 - 除了从 monit.

4

1 回答 1

2

阅读这篇文章后,我设法让它工作:在 ubuntu 下运行延迟作业

出于某种原因,将我的 monitrc 更改为使用以下语法使其工作。我不知道为什么:

start program = "/bin/su - user -c '/usr/bin/env PATH=/home/user/.rbenv/shims:/home/user/.rbenv/bin:$PATH /home/user/puma.sh start'"
stop program = "/bin/su - user -c '/usr/bin/env PATH=/home/user/.rbenv/shims:/home/user/.rbenv/bin:$PATH /home/user/puma.sh stop'" 
于 2012-08-06T08:21:21.747 回答