ruby - 如何通过 sudo 运行 ruby

标签 ruby rvm sudo monit init.d

您好,我正在创建一个用于监视 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 中执行启动服务时,状态是“执行失败”,我检查了 monit 的日志文件,它说

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

当我分析问题的根源时。原因是 monit 以 root 身份运行,而执行 ruby​​ 的脚本将以 sudo/etc/init.d/differ.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>'

请帮忙解决这个问题。我有两个 ruby 版本。

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

最佳答案

您的环境似乎缺失。替换

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

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

这应该正确设置您的 shell 环境。如果您之前运行过 sudo .. >> log,日志文件可能属于 root。改变那个,否则它会失败。我还添加了 STDERR 到 STDOUT 的重定向,因为您可能对错误消息感兴趣。

关于ruby - 如何通过 sudo 运行 ruby,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17834235/

相关文章:

ruby - 如何从特定内存位置或数组开始加载文件

html - latex 输入到 html 和 pdf 输出

ruby - 如何在不同的构建环境中使用 Contentful Middleman 预览 API?

ruby - undefined symbol : SSLv3_method - . ../openssl.so 与 Ruby 和 ArchLinux

bash - Linux - Bash 登录到机器然后成为 root

linux - ambari-server 的用户权限

macos - 'whoami' 在 mac 终端上不工作

javascript - JQuery 序列化不适用于动态元素

ruby-on-rails - 安装 pg gem 时出错——extconf.rb 失败

ruby - 当我通过 RVM 在 OSX Lion 上安装 Ruby 1.9.3 时如何修复 make 错误?