Sudo no ejecutará el comando como otro usuario

Sudo no ejecutará el comando como otro usuario

Estoy intentando que un servidor Unicorn se inicie cuando se inicia el servidor. Creé un script de shell que funciona si inicio sesión como usuario de ubuntu y ejecuto

/etc/init.d/unicorn start

script de shell

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

Cuando reinicié el servidor, noté que el servidor Unicorn no estaba escuchando ningún socket. Como ejecuté el código con éxito como usuario de ubuntu, modifiqué el script para permitir que siempre use el usuario de ubuntu a través de sudo.

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

Después de reiniciar, Unicorn todavía no se inicia, así que intenté ejecutar el script desde la línea de comando. Ahora me sale el siguiente error

sudo: unicorn_rails: command not found

He buscado por todas partes qué podría causar esto, pero me temo que he aprovechado mi conocimiento limitado de Linux. Por lo que puedo entender es que aunque sudo debería usar el usuario de ubuntu para ejecutar los comandos, todavía usa el entorno del usuario root, que no está configurado para ejecutar Ruby o Unicorn. ¿Alguien tiene alguna experiencia con esto?

Respuesta1

Utilice vars globales UNICORN_*como esta:

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

Otra buena forma es extraer variables globales en /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

y en su script de inicio agregue cambiar todas las variables mediante:

if [ -f /etc/default/unicorn ]; then
    . /etc/default/unicorn
fi

Respuesta2

En lugar de usar sudo, intente usar su [username]y luego ejecute el comando.

Respuesta3

Debe especificar la ruta a 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

¿Has configurado sudo correctamente?

información relacionada