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

Как заставить супервизора использовать пользовательскую среду rbenv?

У меня есть демон, которым я бы хотел управлять. У демона есть собственный пользователь, а также собственная среда rbenv, созданная в ruby. Конфигурация супервизора для демона:

[program:hooks]
command=/home/hooks/bin/run.sh
user=hooks
environment=HOME='/home/hooks',USER=hooks,PATH='/home/hooks/.rbenv/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin'

где /home/hooks/bin/run.sh выглядит как:

#!/bin/bash -e                                                                                                                                                 

rbenv init -

cd /home/carehooks/src/
bundle install

thin --timeout 0 --environment 'production' --rackup `pwd`/config.ru --chdir examples/ start

Теперь результат:

# supervisorctl start hooks
hooks: ERROR (abnormal termination)

# cat /var/log/supervisor/hooks-stderr---supervisor-e2Myrz.log 
/bin/readlink: missing operand
Try `/bin/readlink --help' for more information.
/home/hooks/bin/run.sh: line 6: bundle: command not found

# cat /var/log/supervisor/hooks-stdout---supervisor-ndpvIv.log 
export PATH="/home/hooks/.rbenv/shims:${PATH}"
source "/home/hooks/.rbenv/libexec/../completions/rbenv.bash"
rbenv rehash 2>/dev/null
function rbenv() {
  command="$1"
  if [ "$#" -gt 0 ]; then
    shift
  fi

  case "$command" in
  shell)
    eval `rbenv "sh-$command" "$@"`;;
  *)
    command rbenv "$command" "$@";;
  esac
}

Это моя конфигурация супервизора или rbenv? Как я могу заставить их сосуществовать?

rbenv создает прокладки для всех команд (например, ruby, bundle, ...). Эти прокладки находятся в одном каталоге (по умолчанию ~ / .rbenv / shims). Поэтому вы можете позвонить home/my_user/.rbenv/shims/command с параметрами для использования версии команды, определенной rbenv.

В приложении мой conf для образца программы.

[program:sample_program]
directory=/home/my_user/sample_dir
command=/home/my_user/.rbenv/shims/ruby server.rb
user=my_user
autostart=true
autorestart=true
redirect_stderr=true
stdout_logfile=/var/log/sample_program.out