在启动时加载上帝脚本 - 需要全局宝石?
Loading God scripts on startup - requires global gems?
我用上帝来监督我的 Ruby API 和服务。我已经创建了 Init 脚本来在服务器启动时启动这些服务。这样做让我想到了几个问题。
首先我必须以 root 身份拥有脚本 运行?我发现当它加载 init.d 脚本时,进程将由 root 管理 - 需要 Sudo 进行任何更改。
其次,我为一些运行出色的主要进程(例如瘦进程)创建了 RVM 包装器。但是发现我使用的一些 gems 例如 Mongo gem 不会从捆绑器的上下文中加载(我假设这是由于脚本的方式已加载并以 root 身份加载?)所以我被迫执行 Gem install Mongo (和 bson)
有没有办法让 init.d 加载的脚本加载到捆绑器的上下文中?
我可能完全错了,因为我对 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 "" in
start)
echo -n "Starting $DESC: "
$GOD_BIN load -c $GOD_CONFIG
exit 0
fi
RETVAL=0
case "" 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"
这是应该替换您的 $GOD_BIN load -c $GOD_CONFIG
的部分。现在上帝以 $USER 身份运行。
现在,如果您想让它知道您的 ruby 和宝石在哪里,您必须向它提供此信息。我在做
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
我用上帝来监督我的 Ruby API 和服务。我已经创建了 Init 脚本来在服务器启动时启动这些服务。这样做让我想到了几个问题。
首先我必须以 root 身份拥有脚本 运行?我发现当它加载 init.d 脚本时,进程将由 root 管理 - 需要 Sudo 进行任何更改。
其次,我为一些运行出色的主要进程(例如瘦进程)创建了 RVM 包装器。但是发现我使用的一些 gems 例如 Mongo gem 不会从捆绑器的上下文中加载(我假设这是由于脚本的方式已加载并以 root 身份加载?)所以我被迫执行 Gem install Mongo (和 bson)
有没有办法让 init.d 加载的脚本加载到捆绑器的上下文中?
我可能完全错了,因为我对 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 "" in
start)
echo -n "Starting $DESC: "
$GOD_BIN load -c $GOD_CONFIG
exit 0
fi
RETVAL=0
case "" 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"
这是应该替换您的 $GOD_BIN load -c $GOD_CONFIG
的部分。现在上帝以 $USER 身份运行。
现在,如果您想让它知道您的 ruby 和宝石在哪里,您必须向它提供此信息。我在做
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