Sudo führt den Befehl nicht als anderer Benutzer aus

Sudo führt den Befehl nicht als anderer Benutzer aus

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

sudoVersuchen 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?

verwandte Informationen