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