2013-07-24 7 views
4

안녕하세요 저는 루비 프로그램을 모니터링하기위한 새로운 init 스크립트를 만들고 있습니다. sudo를 통해 ruby를 실행하는 방법

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 

그리고 내 MONIT 프로세스가

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 

하지만 난 내 MONIT에서 시작 서비스를 실행할 때 상태였다 "실행이 실패했습니다"하고 나는

 info  : 'differ' start: /bin/bash 
     error : 'differ' failed to start 
     error : 'differ' process is not running 
말했다 MONIT의 로그 파일을 확인

문제의 근본을 분석했을 때. 그 이유는 monit이 root로 실행되고 ruby를 실행하는 스크립트는 sudo /etc/init.d/differ.sh start으로 실행되지만 루비는 'amer'사용자에만 설치됩니다. 나는이 문제에 도와주세요

[email protected]:~$ /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>' 

로 오류를 표시

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

을 시도했습니다. 나는 두 개의 루비 버전을 가지고있다.

 /home/amer/.rvm/rubies/ruby-2.0.0-p247/bin/ruby 
    /home/amer/.rvm/bin/ruby 

답변

1

오랜 고투 끝에 나는이 문제에 대한 해결책을 발견했다. 두 가지 스크립트

export PATH="/home/amer/.rvm/gems/[email protected]/bin:/home/amer/.rvm/gems/[email protected]/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/[email protected] 
export GEM_PATH=/home/amer/.rvm/gems/[email protected]:/home/amer/.rvm/gems/[email protected] 

2) 간부 인 루비 "파일 이름을"번들 rvmsudo()를 사용 전체 경로를 사용하여 PATH, GEM_HOME, GEM_PATH을 수출)

1

을 수행해야합니다

rvmsudo -u amer /home/amer/.rvm/gems/[email protected]/bin/bundle exec /home/amer/.rvm/rubies/ruby-2.0.0-p247/bin/ruby main_scheduler.rb& 

그것은 나를 위해 일했다. 그것은 모든 사람들을위한 희망입니다.

2

환경이 누락 된 것 같습니다. 이 제대로 설치 쉘 환경을해야

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

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

교체합니다. 이전에 sudo .. >> log을 실행 한 경우 로그 파일은 root가 소유하고있을 수 있습니다. 그것을 변경하면 실패 할 것입니다. 또한 오류 메시지에 관심이 있으 G로 STDERR의 리디렉션을 STDOUT에 추가했습니다.

내가 슈퍼 유저로 전환 RVM을 설치합니다

+0

죄송합니다. 나는 두 구문 모두 작동하지 않는 것을 시도했다. – Amerrnath

+0

'EXEC = 'ruby main_scheduler.rb'에서 루비에 대한 전체 경로를 사용해보십시오. – ahilsend

+0

예 여전히 동일한 결과 – Amerrnath

0

는 여기에 내가 초기화에서 루비 스크립트를 실행하려고 할 때 내가 할거야. 이렇게해도 단일 사용자 설치에는 문제가 발생하지 않습니다.

나는 init 스크립트에 넣고 :

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

예 :

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

힌트 : 필요한 모든 보석이 그 gemset에 설치해야합니다.

이 모든 작업을 수행하는 적절한 방법은 rvm 래퍼 스크립트 (see example)를 만드는 것입니다. 그러나 많은 보석 세트가없는 간단한 설정에서 내 방법을 더 쉽게 찾을 수 있습니다.

+0

감사합니다 @nurettin. 나는 그것을 해결했다. – Amerrnath