2015-07-07 10 views
6

Ho un progetto RubyOnRails 3 e sto usando rvm. Voglio passare da uno script sysvinit a supervisord. Lo script sysvinit può avviare il software solo in caso di errore, viene ucciso e riavviato da $ qualcosa. Per lo più io.Utilizzo di supervisord e rvm per eseguire rubyonrails

Nella cartella del progetto è presente un file .ruby-version e un file .ruby-gemset in modo che la versione ruby ​​corretta e il gemset vengano caricati automaticamente. Allora l'applicazione è avviato da uno script di shell che assomiglia a questo:

#!/bin/bash 

RAILS_ENV="production" rails server -d 

Il mio script di init assomiglia a questo e lavora oltre il riavvio e l'arresto:

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

Il mio supervisore config si presenta così:

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

Il problema è che non ci sono binari di binari nel wrapper. in modo che il comando non riesca. Qual è il modo corretto per farlo? Sono fuori di idee e comincerei a mettere insieme qualche brutto script bash che fa il lavoro in un modo molto sbagliato e cattivo, ma lo fa. A proposito ho trovato i binari nella cartella gemme.

$ 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

Credo che sia necessario un comando come: 'command=/home/myuser/.rvm/wrappers/[email protected]/bundle server rails exec -d' – Glupo

+1

Supervisore dice [non per demonizzare] (http : //supervisord.org/subprocess.html#nondaemonizing-of-subprocesses) i tuoi sottoprocessi quindi non usare l'opzione '-d' su' rails server' –

risposta

0

Cercare di RVM sorgente nello script (questo link descrive casi d'uso come la tua).

si deve caricare RVM nella shell del vostro script manualmente:

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

E 'abilitato solo per le shell di login interattiva automaticamente.

Da questo momento in poi, è possibile nelle directory e rvm dovrebbe fare la sua attività.

Problemi correlati