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

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

Я пытаюсь запустить сервер unicorn при загрузке сервера. Я создал скрипт оболочки, который работает, если я вхожу как пользователь 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

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

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

sudo: unicorn_rails: command not found

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

решение1

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

решение2

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

решение3

Вам необходимо указать путь к 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?

Связанный контент