我有一个非常简单的 Ruby 应用程序,它使用 Thin 和 Bundler,我需要将其粘贴在 Ubuntu 盒子上。
我已经在服务器上安装了 Ruby、bundler 等,但在运行应用程序本身时遇到了问题。
本质上我需要一种通过 Capistrano 启动、停止和重新启动应用程序的好方法。
我的 init.d 脚本看起来很像这样:
DAEMON=/home/ubuntu/apps/my_app/shared/bundle/ruby/1.8/bin/thin
SCRIPT_NAME=/etc/init.d/thin
CONFIG_PATH=/etc/thin
# Exit if the package is not installed
[ -x "$DAEMON" ] || exit 0
case "$1" in
start)
cd /home/ubuntu/apps/my_app/current && bundle exec thin start -d -C /etc/thin/my_app.yml
;;
stop)
cd /home/ubuntu/apps/my_app/current && bundle exec thin stop -d -C /etc/thin/my_app.yml
;;
restart)
cd /home/ubuntu/apps/my_app/current && bundle exec thin restart -d -C /etc/thin/my_app.yml
;;
*)
echo "Usage: $SCRIPT_NAME {start|stop|restart}" >&2
exit 3
;;
esac
其结果是:
/home/ubuntu/apps/my_app/shared/bundle/ruby/1.8/gems/thin-1.3.1/lib/thin/daemonizing.rb:51:in `daemonize': uninitialized constant Thin::Daemonizable::Daemonize (NameError)
sudo bundle exec thin start
从服务器上的应用程序根目录运行就可以了(尽管不是作为守护进程)。
因此,我如何设置此应用程序,以便它作为守护进程启动并可通过 init.d 脚本/monit 等进行控制?
答案1
您可以创建 binstubs。使用这些 init-script 应该像其他脚本一样。如果您未在 Thin.yaml 中指定它,则 Thin 只需要 --damonize 作为参数。使用thin install
Thin 会为您生成一个 init-script
捆绑安装--BINSTUBS
如果在 bundle install(1) 中使用 --binstubs 标志,Bundler 将自动创建一个目录(默认为 app_root/bin),其中包含 bundle 中 gems 提供的所有可执行文件。
使用 --binstubs 后,bin/rspec spec/my_spec.rb 与 bundle exec rspec spec/my_spec.rb 相同。
http://gembundler.com/man/bundle-exec.1.html
基于这些特点,这对我有用:
bundle install --binstubs
./bin/thin install
/etc/init.d/thin start