Назад | Перейти на главную страницу

Sudo не будет выполнять команду от имени другого пользователя

Я пытаюсь запустить сервер-единорог при загрузке сервера. Я создал сценарий оболочки, который работает, если я захожу как пользователь ubuntu и запускаю

/etc/init.d/unicorn start

Сценарий оболочки

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

Когда я перезагрузил сервер, я заметил, что сервер-единорог не слушает сокет. Поскольку я успешно выполнил код как пользователь ubuntu, я изменил скрипт, чтобы он всегда использовал пользователя ubuntu через 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

После перезагрузки единорог по-прежнему не запускался, поэтому я попытался запустить скрипт из командной строки. Теперь я получаю следующую ошибку

sudo: unicorn_rails: command not found

Я тщательно искал, что могло вызвать это, но, боюсь, я использовал свое ограниченное понимание Linux. Насколько я понимаю, хотя sudo должен использовать пользователя ubuntu для выполнения команд, он по-прежнему использует среду пользователя root, которая не настроена для запуска ruby ​​или unicorn. У кого-нибудь есть опыт в этом?

Использовать глобальные вары 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

sudo -u ${UNICORN_USER} ${UNICORN_RAIL} -c $UNICORN_CONFIG -D -E production

Еще один хороший способ - извлечь глобальные переменные в /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

и в вашем сценарии инициализации добавьте все переменные:

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

Вам нужно указать путь к 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

Вы правильно настроили sudo?

Вместо того, чтобы использовать sudo, попробуйте использовать su [username] а затем выполните команду.