El script de inicio del servicio de Unicornio arroja "-su: paquete: comando no encontrado"
Recientemente creé un VPS en DigitalOcean para alojar una aplicación de rieles. Seguí su guía para configurar Unicorn con mi aplicación.https://www.digitalocean.com/community/tutorials/how-to-deploy-a-rails-app-with-unicorn-and-nginx-on-ubuntu-14-04
Se produjo un problema cuando corrísudo service unicorn_appxyz start
. El error dado fue-su: bundle: command not found
Rastreé el script init.d y pegué el comando de inicio del servidor evaluado en la terminal y funciona bien cuando se ejecuta bajo el usuariojoe (el usuario que instala rbenv y el propietario de la aplicación). El comando evaluado es
su - joe -c cd /home/joe/appxyz && bundle exec unicorn -c config/unicorn.rb -E production -D
Entonces sudo su - enraíz usuario y corrióservice unicorn_appxyz start
El error fue, por supuesto, el mismo. Luego ejecuté el comando evaluado en la raíz y regresó con este error
The program 'bundle' is currently not installed. You can install it by typing:
apt-get install bundler
Parece que el script no está cambiando el usuario? Esta es probablemente la causa de que el unicornio no se inicie cuando inicio mi VPS.
El guión completo de unicornio está aquí:
#!/bin/sh
### BEGIN INIT INFO
# Provides: unicorn
# Required-Start: $all
# Required-Stop: $all
# Default-Start: 2 3 4 5
# Default-Stop: 0 1 6
# Short-Description: starts the unicorn app server
# Description: starts unicorn using start-stop-daemon
### END INIT INFO
set -e
USAGE="Usage: $0 <start|stop|restart|upgrade|rotate|force-stop>"
# app settings
USER="joe"
APP_NAME="appxyz"
APP_ROOT="/home/$USER/$APP_NAME"
ENV="production"
# environment settings
PATH="/home/$USER/.rbenv/shims:/home/$USER/.rbenv/bin:$PATH"
CMD="cd $APP_ROOT && bundle exec unicorn -c config/unicorn.rb -E $ENV -D"
PID="$APP_ROOT/shared/pids/unicorn.pid"
OLD_PID="$PID.oldbin"
# make sure the app exists
cd $APP_ROOT || exit 1
sig () {
test -s "$PID" && kill -$1 `cat $PID`
}
oldsig () {
test -s $OLD_PID && kill -$1 `cat $OLD_PID`
}
case $1 in
start)
sig 0 && echo >&2 "Already running" && exit 0
echo "Starting $APP_NAME"
su - $USER -c "$CMD"
;;
stop)
echo "Stopping $APP_NAME"
sig QUIT && exit 0
echo >&2 "Not running"
;;
force-stop)
echo "Force stopping $APP_NAME"
sig TERM && exit 0
echo >&2 "Not running"
;;
restart|reload|upgrade)
sig USR2 && echo "reloaded $APP_NAME" && exit 0
echo >&2 "Couldn't reload, starting '$CMD' instead"
$CMD
;;
rotate)
sig USR1 && echo rotated logs OK && exit 0
echo >&2 "Couldn't rotate logs" && exit 1
;;
*)
echo >&2 $USAGE
exit 1
;;
esac
Más información relacionada
Aquí están los caminos para ruby, rails y bundler bajo el usuario Joe. Debajo de la raíz no se encuentran.
joe@vps:~$ which ruby
/home/joe/.rbenv/shims/ruby
joe@vps:~$ which rails
/home/joe/.rbenv/shims/rails
joe@vps:~$ which bundle
/home/joe/.rbenv/shims/bundle
Tiene sentido que no se pueda encontrar el paquete bajo el usuario root, pero el comando de inicio debe haber cambiado al usuario 'joe' para ejecutar el comando del paquete. Esta es la parte que no entiendo.