2015-07-07 20 views
6

Ich habe ein RubyOnRails 3 Projekt und ich verwende rvm. Ich möchte von einem Sysvinit-Skript zu Supervisord wechseln. Das sysvinit-Skript kann die Software nur im Falle eines Fehlers starten, wenn sie von $ etwas abgebrochen und neu gestartet wird. Meistens ich.Verwenden von Supervisord und Rvm zum Ausführen von Rubyonrails

Im Projektordner gibt es eine .ruby-version und eine .ruby-gemset Datei, so dass die korrekte Ruby Version und der Edelstein automatisch geladen werden. Dann ist die App startet mit einem Shell-Skript, das wie folgt aussieht:

#!/bin/bash 

RAILS_ENV="production" rails server -d 

Mein Init-Skript wie folgt aussieht und funktioniert neben dem Neustart und Anhalten:

#!/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 

Mein Vorgesetzter Config sieht wie folgt aus:

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

Problem ist, dass es keine rails binary im Wrapper gibt. damit der Befehl fehlschlägt. Was ist der richtige Weg, dies zu tun? Ich habe keine Ideen mehr und würde anfangen, ein wirklich hässliches Bash-Skript zusammenzustellen, das den Job auf eine sehr falsche und schlechte Art und Weise erledigt, tut es aber. Übrigens habe ich im Gems-Ordner Schienen gefunden.

$ ls /home/myuser/.rvm/wrappers/[email protected]/ 
bundle bundler erb executable-hooks-uninstaller gem irb rake rdoc ri ruby testrb 
$ which rails 
/home/ffwi/.rvm/gems/[email protected]/bin/rails 
+2

Ich glaube, Sie brauchen einen Befehl wie: 'command=/home/myuser/.rvm/wrappers/[email protected]/bundle exec Schienen Server -d' – Glupo

+1

Betreuer sagt [nicht daemonize] (http : //supervisord.org/subprocess.html#nondaemonizing-of-subprocesses) verwenden Sie daher nicht die '-d' Option auf' rails server' –

Antwort

0

Versuchen Sie, Quelle rvm in Ihrem Skript (das link beschreibt usecases wie Ihre).

Sie haben RVM in die Schale des Skripts manuell laden:

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

Es wird nur dann automatisch für interaktive Login-Shells aktiviert.

Von diesem Punkt können Sie cd in Verzeichnisse und Rvm sollte sein Geschäft tun.