Изменились ли сценарии upstart или bash в Ubuntu 14.04? (Попытка загрузить sidekiq с выскочкой)

Я новичок в написании сценариев bash, но мне кажется, что мне действительно не хватает чего-то базового. Я пытаюсь использовать слегка измененную версию скрипта upstart sidekiq Майка Перхэма на машине с Ubuntu 14.04, но почти ничего не оценивается должным образом:

  • экспорт не работает
  • источник, похоже, не оценивает мою измененную переменную PATH в .bashrc или запускает команду инициализации rbenv
  • cd, кажется, не меняет каталоги, если только команда $(pwd) не является правильным способом ее оценки

Вот мой модифицированный скрипт:

# /etc/init/sidekiq.conf - Sidekiq config

# This example config should work with Ubuntu 12.04+.  It
# allows you to manage multiple Sidekiq instances with
# Upstart, Ubuntu's native service management tool.

# change to match your deployment user
setuid deploy
setgid deploy

stop on (stopping workers or runlevel [06])

respawn
respawn limit 3 30

instance $index

script
# this script runs in /bin/sh by default
# respawn as bash so we can source in rbenv
exec /bin/bash <<EOT
  # use syslog for logging
  # exec &> /dev/kmsg

  # pull in system rbenv
  export HOME=/home/deploy
  echo "home is $HOME"
  source /home/deploy/.bashrc
  echo "path is $PATH"

  cd /home/deploy/domain_freek/current
  echo "user is $(whoami) and pwd is $(pwd) and rbenv is located at $(which rbenv)"
  exec bundle exec sidekiq -i ${index} -e production
EOT
end script

Вот что я получаю в файле журнала выскочки:

home is
path is /usr/local/sbin:/usr/local/bin:/usr/bin:/usr/sbin:/sbin:/bin
user is deploy and pwd is / and rbenv is located at 
/bin/bash: line 12: exec: bundle: not found

person Josh    schedule 18.10.2014    source источник
comment
Попробуйте exec /bin/bash <<'EOT' (жесткие кавычки вокруг маркера). Вывод должен иметь больше смысла.   -  person Mat    schedule 18.10.2014
comment
Хорошо! Спасибо, жесткие кавычки помогли. Теперь HOME экспортируется, и cd фактически меняет каталог ... Теперь мне просто нужно выяснить, как правильно загрузить файл .bashrc или инициализировать rbenv другим способом.   -  person Josh    schedule 18.10.2014


Ответы (3)


2 Изменения сделали все различие:

1) Добавьте жесткие кавычки в EOT в exec /bin/bash << 'EOT' (благодаря Мэту, спасибо!)

2) Вместо того, чтобы загружать .bashrc из исходного кода, добавьте строки rbenv из .bashrc непосредственно в скрипт upstart. Замените source /home/deploy/.bashrc на:

export PATH="$HOME/.rbenv/bin:$PATH"
eval "$(rbenv init -)"
export PATH="$HOME/.rbenv/plugins/ruby-build/bin:$PATH"

Я понятия не имею, почему эти два изменения имели значение, и связано ли это с более новой версией Ubuntu, выскочки или bash. Если кто может объяснить, отзовитесь.

Я включил свой полный рабочий скрипт для тех, кто просто ищет ответ:

# /etc/init/sidekiq.conf - Sidekiq config

# This example config should work with Ubuntu 12.04+.  It
# allows you to manage multiple Sidekiq instances with
# Upstart, Ubuntu's native service management tool.
#
# See workers.conf for how to manage all Sidekiq instances at once.
#
# Save this config as /etc/init/sidekiq.conf then mange sidekiq with:
#   sudo start sidekiq index=0
#   sudo stop sidekiq index=0
#   sudo status sidekiq index=0
#
# or use the service command:
#   sudo service sidekiq {start,stop,restart,status}
#

description "Sidekiq Background Worker"

# no "start on", we don't want to automatically start
stop on (stopping workers or runlevel [06])

# change to match your deployment user
setuid deploy
setgid deploy

respawn
respawn limit 3 30

# TERM is sent by sidekiqctl when stopping sidekiq.  Without declaring these as normal exit codes, it just respawns.
normal exit 0 TERM

instance $index

script
# this script runs in /bin/sh by default
# respawn as bash so we can source in rbenv
exec /bin/bash << 'EOT'
  # use syslog for logging
  # exec &> /dev/kmsg

  # pull in system rbenv
  export HOME=/home/deploy
  echo "$HOME"
  #source /home/deploy/.bashrc
  export PATH="$HOME/.rbenv/bin:$PATH"
  eval "$(rbenv init -)"
  export PATH="$HOME/.rbenv/plugins/ruby-build/bin:$PATH"
  echo "$PATH"

  cd /home/deploy/domain_freek/current
  echo "user is $(whoami) and pwd is $(pwd) and rbenv is located at $(which rbenv)"  
  exec bundle exec sidekiq -i ${index} -e production
EOT
end script
person Josh    schedule 18.10.2014
comment
Пожалуйста, отправьте PR, чтобы мы могли исправить это вверх по течению! - person Mike Perham; 20.10.2014
comment
Я бы использовал поддержку ENV Upstart напрямую: upstart.ubuntu.com/cookbook/#env env HOME=/дом/развернуть - person Mike Perham; 20.10.2014
comment
Хотелось бы, чтобы можно было получить .bashrc из скрипта Upstart. Невероятно раздражает необходимость размещать env vars в двух местах при подготовке приложений. - person odigity; 11.01.2015
comment
Просто добавил проблему в sidekiq, чтобы обновить скрипт для устранения этой проблемы: github.com/mperham/sidekiq /вопросы/2361 - person THpubs; 19.05.2015

В файле .bashrc по умолчанию в Ubuntu 14.04 есть пара строк, которые нужно немедленно вернуть, если оболочка работает в неинтерактивном режиме. Когда вы удалите эти строки из вашего bashrc, тогда source будет работать, как и ожидалось, в выскочке.

~/.bashrc (Строки для удаления)

# If not running interactively, don't do anything
case $- in
    *i*) ;;
      *) return;;
esac
person Mark G.    schedule 10.02.2015
comment
Я использую 14.04.4, и строка, которую я прокомментировал из .bashrc, была [ -z "$PS1" ] && return. Это позволило мне просто получить .bashrc в сценарии выскочки. Спасибо за совет! - person Lee Smith; 10.03.2016

Решение Джоша не сработало для меня в Ubuntu 14.04 с использованием rbenv. Однако это сработало:

exec /bin/bash <<EOF
  export RBENV_ROOT=/home/ubuntu/.rbenv
  export RBENV_VERSION=2.2.2
  cd /var/www/app/current
  exec /home/ubuntu/.rbenv/bin/rbenv exec bundle exec sidekiq -i ${index} -e production
EOF
person dft    schedule 12.02.2016