Question

Hi I am creating a new init script for monitoring a ruby program .

NAME=differ
FILE_PATH=/home/amer/Documents/ruby_projects/differ/
PIDFILE=/home/amer/pid/differ.pid
PID=$$
EXEC='/home/amer/.rvm/rubies/ruby-2.0.0-p247/bin/ruby main_scheduler.rb'

do_start(){
    echo "started"
    cd $FILE_PATH
    pwd
    $EXEC  >> init_log/output.log &
    echo $! > $PIDFILE
    echo "---------"
    echo `cat $PIDFILE`
    echo "all are DONE "
}

do_stop(){
    PID=`cat $PIDFILE`
    echo $PID
    if ps -p $PID ; then
        kill -6  $PID
        echo "it is over"
    else
        echo "its not running"
    fi
}

case "$1" in
    start)
    echo $$
        echo -n "Starting script differ "
        do_start
        ;;
    stop)
        echo "stopping ...."
        do_stop
        ;;
    status)
        PID=`cat $PIDFILE`
        echo "STATUS $PID"
        if  ps -p $PID -f; then
            echo running
        else
            echo not running
        fi
        ;;
    restart|reload|condrestart)
        do_stop
        do_start
        ;;
    *)
        echo "Usage: /etc/init.d/blah {start|stop}"
        exit 1
        ;;
esac

exit 0

And my monit process is

 check process differ with pidfile /home/amer/pid/differ.pid
if changed pid then exec "/etc/init.d/differ start"
 start program = "/etc/init.d/differ start" 
 stop program = "/etc/init.d/differ stop"
 if 5 restarts within 5 cycles then timeout

But when I execute start service in my monit the status was "Execution failed" and i checked the log file of monit it said

       info     : 'differ' start: /bin/bash
       error    : 'differ' failed to start
       error    : 'differ' process is not running

When I analyzed the root of the problem . the reason was monit is running as root and the script which executes ruby will be executing as sudo /etc/init.d/differ.sh start but ruby is installed only in user 'amer' . I have tried

 sudo -u amer $EXEC >>init_log/output.log &

it displayed the error as

 amer@amer-Inspiron-1525:~$ /home/amer/.rvm/rubies/ruby-2.0.0-p247/lib/ruby/2.0.0/rubygems/core_ext/kernel_require.rb:45:in `require': cannot load such file -- bundler/setup (LoadError)
from /home/amer/.rvm/rubies/ruby-2.0.0-p247/lib/ruby/2.0.0/rubygems/core_ext/kernel_require.rb:45:in `require'
from main_scheduler.rb:2:in `<main>'

Please help in this problem . I have two ruby versions.

     /home/amer/.rvm/rubies/ruby-2.0.0-p247/bin/ruby
     /home/amer/.rvm/bin/ruby
Was it helpful?

Solution 2

after a long struggle i found the solution for this problem . Two things must be done

1) EXPORT your PATH,GEM_HOME,GEM_PATH in the script

export PATH="/home/amer/.rvm/gems/ruby-2.0.0-p247@rails329/bin:/home/amer/.rvm/gems/ruby-2.0.0-p247@global/bin:/home/amer/.rvm/rubies/ruby-2.0.0-p247/bin:/home/amer/.rvm/bin:/usr/lib/lightdm/lightdm:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games"   
export GEM_HOME=/home/amer/.rvm/gems/ruby-2.0.0-p247@rails329
export GEM_PATH=/home/amer/.rvm/gems/ruby-2.0.0-p247@rails329:/home/amer/.rvm/gems/ruby-2.0.0-p247@global

2) USE rvmsudo bundle exec ruby "filename" (use full path)

 rvmsudo -u amer  /home/amer/.rvm/gems/ruby-2.0.0-p247@rails329/bin/bundle exec  /home/amer/.rvm/rubies/ruby-2.0.0-p247/bin/ruby main_scheduler.rb&

it worked for me . hope it does for everyone .

OTHER TIPS

It looks like your environment is missing. Replace

sudo -u amer $EXEC >>init_log/output.log &

with

su -s /bin/bash - amer -c "$EXEC >> init_log/output.log 2>&1" &

This should setup your shell environment properly. If you ran sudo .. >> log before, the log file might be owned by root. Change that or it will fail. I also added the redirect of STDERR to STDOUT, since you are probably interested in error messages.

Here's what I do when I want to run ruby scripts in init:

I switch to super user and install rvm. This won't cause problems with your single user installation.

I put this in the init script:

/usr/local/rvm/bin/rvm-shell 'yourgemset' -c 'ruby pathtoyourscript/yourscript.rb'

Example:

/usr/local/rvm/bin/rvm-shell 'jruby-1.7.4' -c 'ruby /home/someone/service.rb'

Hint: all the necessary gems need to be installed in that gemset.

The proper way of doing all this is to create an rvm wrapper script (see example) but I find my method easier for a simple setup where there aren't many gemsets.

Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top