Unicorn service upstart script löst "-su: bundle: befehl not found" aus

Ich habe kürzlich ein VPS auf DigitalOcean erstellt, um eine Rails-App zu hosten. Ich habe ihre Anleitung zum Einrichten von Unicorn mit meiner Anwendung befolgt.https: //www.digitalocean.com/community/tutorials/how-to-deploy-a-rails-app-with-unicorn-and-nginx-on-ubuntu-14-0

Ein Problem ist aufgetreten, als ich @ lisudo service unicorn_appxyz start. Der angegebene Fehler war-su: bundle: command not found

Ich verfolgte das init.d-Skript und fügte den ausgewerteten Serverstartbefehl in das Terminal ein und es funktioniert einwandfrei, wenn es unter dem Benutzer @ ausgeführt wir Joe (der Benutzer, der rbenv installiert, und der Besitzer der App). Der ausgewertete Befehl lautet

su - joe -c cd /home/joe/appxyz && bundle exec unicorn -c config/unicorn.rb -E production -D

Ich dann sudo su - inWurze user und ranservice unicorn_appxyz start der fehler war natürlich der selbe. Dann habe ich den evaluierten Befehl unter root ausgeführt und er kehrt mit diesem Fehler zurück

The program 'bundle' is currently not installed. You can install it by typing:
apt-get install bundler

Es scheint, dass das Skript den Benutzer nicht wechselt? Dies ist wahrscheinlich die Ursache dafür, dass das Einhorn beim Booten meines VPS nicht startet.

Das vollständige Einhorn-Upstart-Skript finden Sie hier:

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

Mehr dazugehörige Informationen

hier sind die Pfade für Ruby, Rails und Bundler unter User Joe. Unter root werden sie nicht gefunden.

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

Es macht Sinn, dass der Bundler nicht unter root-Benutzer gefunden wurde, aber der Befehl upstart sollte auf Benutzer 'joe' umgeschaltet sein, um den Bundle-Befehl auszuführen. Dies ist der Teil, den ich nicht verstehe.