Domanda

I have Rails app set up using Jruby with puma as the web server. Puma doesn't daemonize on its own, so I wrapped it in a bash script to handle generating a pid (as described in the Monit FAQ). The script is below:

#!/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

This works from the command line and it works even if I execute it after running the below to simulate the monit shell:

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

The relevant monitrc lines are below:

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"

The monit log shows it constantly try to start puma, and it even gets so far as regenerating a new PID, but is never able to actually start puma. Every time I try to run this script from every other context I can think of it works - except from monit.

È stato utile?

Soluzione

I managed to get this to work after reading this post: running delayed_job under monit with ubuntu

For some reason, changing my monitrc to use the following syntax made this work. I have no idea why:

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'" 
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top