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