Sudo não executará comando como outro usuário

Sudo não executará comando como outro usuário

Estou tentando fazer com que um servidor unicórnio seja iniciado quando o servidor for inicializado. Eu criei um script de shell que funciona se eu logar como usuário do Ubuntu e executar

/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

Quando reiniciei o servidor, percebi que o servidor unicórnio não estava escutando um soquete. Como executei o código com sucesso como usuário do Ubuntu, modifiquei o script para permitir que ele sempre use o usuário do Ubuntu via 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

Depois de reiniciar, o unicórnio ainda não iniciava, então tentei executar o script na linha de comando. Agora recebo o seguinte erro

sudo: unicorn_rails: command not found

Pesquisei de alto a baixo o que poderia causar isso, mas temo ter explorado meu conhecimento limitado do Linux. Pelo que entendi é que embora o sudo deva usar o usuário ubuntu para executar os comandos, ele ainda usa o ambiente do usuário root, que não está configurado para rodar Ruby ou unicórnio. alguém tem alguma experiência com isso?

Responder1

Use vars globais UNICORN_*assim:

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

Outra boa maneira é extrair vars globais em /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

e em seu script de inicialização adicione alterar todos os vars por:

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

Responder2

Em vez de usar sudo, tente usar su [username]e execute o comando.

Responder3

Você precisa especificar o caminho para 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

Você configurou o sudo apropriadamente?

informação relacionada