6

RubyOnRails 3 プロジェクトがあり、rvm を使用しています。sysvinit スクリプトから Supervisord に切り替えたいと考えています。sysvinit スクリプトは、エラーが発生した場合にのみソフトウェアを起動でき、$something によって強制終了されて再起動されます。主に私。

プロジェクト フォルダーには、適切な Ruby バージョンと gemset が自動的に読み込まれるように.ruby-versionするファイルがあります。.ruby-gemset次に、アプリは次のようなシェル スクリプトで開始されます。

#!/bin/bash

RAILS_ENV="production" rails server -d

私のinitスクリプトは次のようになり、再起動と停止以外に機能します:

#!/bin/sh
### BEGIN INIT INFO
# Provides:          myapp
# Required-Start:    $local_fs $remote_fs $network $syslog
# Required-Stop:     $local_fs $remote_fs $network $syslog
# Default-Start:     2 3 4 5
# Default-Stop:      0 1 6
# Short-Description: starts myapp
# Description:       starts the myapp software
### END INIT INFO

USER=myuser
PATH=$PATH
DAEMON=go.sh
DAEMON_OPTS=""
NAME=myapp
DESC="myapp for $USER"
PID=/home/$USER/myapp/tmp/pids/server.pid

case "$1" in
  start)
        CD_TO_APP_DIR="cd /home/$USER/myapp"
        START_DAEMON_PROCESS="$DAEMON $DAEMON_OPTS"

        echo -n "Starting $DESC: "
        if [ $(whoami) = root ]; then
          su - $USER -c "$CD_TO_APP_DIR > /dev/null 2>&1 && ./$START_DAEMON_PROCESS &"
        else
          $CD_TO_APP_DIR > /dev/null 2>&1 && ./$START_DAEMON_PROCESS &
        fi
        echo "$NAME."
        ;;
  stop)
        echo -n "Stopping $DESC: "
        kill -QUIT `cat $PID`
        echo "$NAME."
        ;;
  restart)
        echo -n "Restarting $DESC: "
        kill -USR2 `cat $PID`
        echo "$NAME."
        ;;
  reload)
        echo -n "Reloading $DESC configuration: "
        kill -HUP `cat $PID`
        echo "$NAME."
        ;;
  *)
        echo "Usage: $NAME {start|stop|restart|reload}" >&2
        exit 1
        ;;
esac

exit 0

私のスーパーバイザー設定は次のようになります。

[program:myapp]
directory=/home/myuser/myapp/
command=/home/myuser/.rvm/wrappers/ruby-2.1.5@myapp/rails server -d
environment=RAILS_ENV="production"
autostart=true
autorestart=true

問題は、ラッパーに Rails バイナリがないことです。コマンドが失敗するようにします。これを行う正しい方法は何ですか?私はアイデアがありません。非常に醜いbashスクリプトをまとめて、非常に間違った悪い方法で仕事をしますが、それを行います。ところで、gems フォルダーに rails が見つかりました。

$ ls /home/myuser/.rvm/wrappers/ruby-2.1.5@myapp/
bundle  bundler  erb  executable-hooks-uninstaller  gem  irb  rake  rdoc  ri  ruby  testrb
$ which rails
/home/ffwi/.rvm/gems/ruby-2.1.5@ffwi-extern/bin/rails
4

1 に答える 1

0

スクリプトで rvm を入手してみてください (このリンクでは、あなたのようなユースケースについて説明しています)。

RVM をスクリプトのシェルに手動でロードする必要があります。

    source "$HOME/.rvm/scripts/rvm"

対話型ログイン シェルに対してのみ自動的に有効になります。

この時点から、ディレクトリに入ることができcd、rvm がその仕事をするはずです。

于 2015-07-08T13:42:10.537 に答える