Ruby 启动时加载上帝脚本-需要全局gems吗?

Ruby 启动时加载上帝脚本-需要全局gems吗?,ruby,linux,mongodb,god,Ruby,Linux,Mongodb,God,我用上帝来守护我的Ruby API和服务。我创建了Init脚本,以便在服务器启动时启动这些服务。这样做让我产生了几个问题 首先,我必须让脚本作为root运行?我发现,当它加载init.d脚本时,进程将由root用户管理,任何更改都需要Sudo 其次,我已经为一些工作出色的主要流程(如thin)创建了RVM包装。但是我发现我使用的一些gem,比如Mongo gem,不会从bundler的上下文中加载(我假设这是由于脚本是如何加载的,并且它是作为root加载的?),所以我不得不执行gem安装Mong

我用上帝来守护我的Ruby API和服务。我创建了Init脚本,以便在服务器启动时启动这些服务。这样做让我产生了几个问题

首先,我必须让脚本作为root运行?我发现,当它加载init.d脚本时,进程将由root用户管理,任何更改都需要Sudo

其次,我已经为一些工作出色的主要流程(如thin)创建了RVM包装。但是我发现我使用的一些gem,比如Mongo gem,不会从bundler的上下文中加载(我假设这是由于脚本是如何加载的,并且它是作为root加载的?),所以我不得不执行gem安装Mongo(和bson)

有没有办法让init.d加载的脚本加载到bundler的上下文中

我可能完全错了,因为我对Ruby部署和Linux配置还是相当陌生的

下面是我的上帝剧本的一个例子:

require 'yaml'

config_path = '/opt/broker/current/config/api_config.yml'
config = YAML.load_file config_path

God.watch do |w|
  w.name = 'Broker_API'
  pid_file = config[:pid_file_path]
  w.pid_file = pid_file

  w.behavior :clean_pid_file

  w.dir = config[:deployed_current_path]
  w.env = config[:deployed_current_path]

  port = config[:api_port]
  server_logs = config[:api_logs]
  config_ru = config[:api_config_file]

  w.start = 'bundle exec thin -l %s -P %s -d -D -R %s -p %s --threaded start' %[server_logs, pid_file, config_ru, port]
  w.stop = 'bundle exec thin -l %s -P %s -d -D -R %s -p %s --threaded stop' %[server_logs, pid_file, config_ru, port]
  w.restart = 'bundle exec thin -l %s -P %s -d -D -R %s -p %s --threaded restart' %[server_logs, pid_file, config_ru, port]
  w.log = config[:api_god_log]

  w.keepalive
end
和我的初始化脚本:

#!/bin/sh

### BEGIN INIT INFO
# Provides: god
# Required-Start: $all
# Required-Stop: $all
# Default-Start: 2 3 4 5
# Default-Stop: 0 1 6
# Short-Description: God
### END INIT INFO

NAME=god
DESC=god
GOD_BIN=/home/username/.rvm/wrappers/Godrunner/god
GOD_CONFIG=/etc/god/god.conf
GOD_LOG=/var/log/god.log
GOD_PID=/var/run/god.pid

set -e

RETVAL=0

case "$1" in
  start)
    echo -n "Starting $DESC: "
    $GOD_BIN load -c $GOD_CONFIG
 exit 0
fi

RETVAL=0

case "$1" in
  start)
    echo -n "Starting $DESC: "
    $GOD_BIN load -c $GOD_CONFIG
    RETVAL=$?
    echo "$NAME."
    ;;
  status)
 $GOD_BIN status
    RETVAL=$?
    ;;
  *)
    echo "Usage: god {start|status}"
    exit 1
    ;;
esac

exit $RETVAL

我是这样解决的:

daemon --user $USER "$GOD_BIN \
-c $CONFIG_FILE \
-l $LOG_FILE \
--log-level $LOG_LEVEL \
-P $PID_FILE >/dev/null"
这是应该替换
$good\u BIN load-c$good\u CONFIG
的部分。现在上帝以$USER的身份运行

现在,如果你想让它知道你的红宝石和宝石在哪里,你必须向它提供这些信息。我在做什么

source /etc/profile.d/ruby.sh
在剧本开头的某个地方

ruby.sh内容:

export PATH=/opt/ruby-2.1/bin/:$PATH
export GEM_PATH=/opt/ruby-2.1/lib64/ruby/gems/2.1.0

你解决过这个问题吗?我还面临一个问题,即我的受监控服务是以root用户身份运行的