如何通过sudo运行ruby
嗨,我正在创建一个新的init脚本来监视ruby程序如何通过sudo运行ruby,ruby,rvm,sudo,monit,init.d,Ruby,Rvm,Sudo,Monit,Init.d,嗨,我正在创建一个新的init脚本来监视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
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
我的监控过程是
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中执行start服务时,状态是“Execution failed”,我检查了monit的日志文件,它说
info : 'differ' start: /bin/bash
error : 'differ' failed to start
error : 'differ' process is not running
当我分析问题的根源时。原因是monit以root用户身份运行,执行ruby的脚本将以sudo/etc/init.d/difference.sh start的形式执行,但是ruby只安装在用户“amer”中。我试过了
sudo -u amer $EXEC >>init_log/output.log &
它将错误显示为
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>'
看起来您的环境丢失了。替换
sudo -u amer $EXEC >>init_log/output.log &
与
这将正确设置shell环境。如果您运行
sudo..>>日志
之前,日志文件可能由root所有。改变它,否则它会失败。我还将STDERR重定向到STDOUT,因为您可能对错误消息感兴趣。当我想在init中运行ruby脚本时,我会这样做:
我切换到超级用户并安装rvm。这不会导致单用户安装出现问题
我把它放在初始化脚本中:
/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'
提示:所有必要的gems都需要安装在该gems集中
做这一切的正确方法是创建一个rvm包装器脚本(),但我发现我的方法对于一个没有太多宝石的简单设置更容易。经过长期的努力,我找到了这个问题的解决方案。 必须做两件事 1) 导出脚本中的路径、GEM_HOME、GEM_路径
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) 使用rvmsudo bundle exec ruby“filename”(使用完整路径)
这对我有用。希望对每个人都适用。尝试在
EXEC='ruby main\u scheduler.rb'
@user1475089中使用ruby的完整路径,而不是sudo-u
。这应该行得通。
/usr/local/rvm/bin/rvm-shell 'jruby-1.7.4' -c 'ruby /home/someone/service.rb'
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
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&