
Ich versuche, einen Unicorn-Server zu starten, wenn der Server bootet. Ich habe ein Shell-Skript erstellt, das funktioniert, wenn ich mich als Ubuntu-Benutzer anmelde und ausführe
/etc/init.d/unicorn start
Shell-Skript
#!/bin/sh
case "$1" in
start)
cd /home/ubuntu/projects/asbest/current/
unicorn_rails -c /home/ubuntu/projects/asbest/current/config/unicorn.rb -D -E production
;;
stop)
if ps aux | awk '{print $2 }' | grep `cat ~/projects/asbest/current/tmp/pids/unicorn.pid`> /dev/null; then kill `cat ~/projects/asbest/current/tmp/pids/uni$
;;
restart)
$0 stop
$0 start
;;
esac
Als ich den Server neu startete, bemerkte ich, dass der Unicorn-Server nicht auf einen Socket hörte. Da ich den Code erfolgreich als Ubuntu-Benutzer ausgeführt hatte, änderte ich das Skript so, dass es immer den Ubuntu-Benutzer über sudo verwendet.
#!/bin/sh
case "$1" in
start)
cd /home/ubuntu/projects/asbest/current/
sudo -u ubuntu unicorn_rails -c /home/ubuntu/projects/asbest/current/config/unicorn.rb -D -E production
;;
stop)
if ps aux | awk '{print $2 }' | grep `cat ~/projects/asbest/current/tmp/pids/unicorn.pid`> /dev/null; then sudo -u ubuntu kill `cat ~/projects/asbest/current/tmp/pids/uni$
;;
restart)
$0 stop
$0 start
;;
esac
Nach dem Neustart startete Unicorn immer noch nicht, also versuchte ich, das Skript über die Befehlszeile auszuführen. Jetzt erhalte ich die folgende Fehlermeldung
sudo: unicorn_rails: command not found
Ich habe überall gesucht, um herauszufinden, was dies verursachen könnte, aber ich fürchte, ich habe nur meine begrenzten Kenntnisse von Linux genutzt. Soweit ich es verstehe, verwendet sudo zwar den Ubuntu-Benutzer zum Ausführen der Befehle, aber dennoch die Umgebung des Root-Benutzers, die nicht für die Ausführung von Ruby oder Unicorn konfiguriert ist. Hat jemand Erfahrung damit?
Antwort1
Verwenden Sie globale Variablen UNICORN_*
wie diese:
UNICORN_HOME=/the/path
UNICORN_RAIL=${UNICORN_HOME}/unicorn_rail
UNICORN_CONFIG=${UNICORN_HOME}/config/unicorn.rb
UNICORN_PID=${UNICORN_HOME}/tmp/pids/unicorn.pid
UNICORN_USER=ubuntu
sudo -u ${UNICORN_USER} ${UNICORN_RAIL} -c $UNICORN_CONFIG -D -E production
Eine weitere gute Möglichkeit besteht darin, globale Variablen in folgendem Format zu extrahieren /etc/default/unicorn
:
UNICORN_HOME=/the/path
UNICORN_RAIL=${UNICORN_HOME}/unicorn_rail
UNICORN_CONFIG=${UNICORN_HOME}/config/unicorn.rb
UNICORN_PID=${UNICORN_HOME}/tmp/pids/unicorn.pid
UNICORN_USER=ubuntu
und ändern Sie in Ihrem Init-Skript alle Variablen durch:
if [ -f /etc/default/unicorn ]; then
. /etc/default/unicorn
fi
Antwort2
sudo
Versuchen Sie es statt mit su [username]
und führen Sie dann den Befehl aus.
Antwort3
Sie müssen den Pfad angeben zu unicorn_rails
:
UNICORN_HOME=/home/ubuntu/projects/asbest/current
cd $UNICORN_HOME
sudo -u ubuntu $UNICORN_HOME/unicorn_rails -c $UNICORN_HOME/config/unicorn.rb -D -E production
Haben Sie sudo entsprechend konfiguriert?