Промениха ли се скриптовете за стартиране или bash на Ubuntu 14.04? (Опитвам се да стартирам sidekiq с upstart)

Аз съм доста нов в скриптовете за bash, но имам чувството, че наистина ми липсва нещо основно тук. Опитвам се да направя едва модифицирана версия на скрипта за upstart sidekiq на Майк Пъръм на машина с Ubuntu 14.04, но почти нищо не се оценява според очакванията:

  • експортирането изглежда не работи
  • източникът изглежда не оценява моята променена променлива PATH в .bashrc или изпълнява командата rbenv init
  • 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

Ето резултата, който получавам в регистрационния файл на upstart:

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 директно към скрипта за стартиране. Заменете source /home/deploy/.bashrc с:

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

Нямам представа защо тези две промени направиха разликата и дали това е свързано с по-нова версия на ubuntu, upstart или 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=/home/deploy - person Mike Perham; 20.10.2014
comment
Иска ми се да беше възможно да се извлече .bashrc от вътрешността на скрипта Upstart. Изключително досадно е да се налага да поставяте env vars на две места, когато осигурявате приложения. - person odigity; 11.01.2015
comment
Току-що добавих проблем в sidekiq, за да актуализирам скрипта, за да коригираме този проблем: github.com/mperham/sidekiq /issues/2361 - person THpubs; 19.05.2015

Файлът .bashrc по подразбиране в Ubuntu 14.04 има няколко реда, които да се върнат незабавно, ако обвивката работи в неинтерактивен режим. Когато премахнете тези редове от вашия bashrc, тогава source ще работи както се очаква в upstart.

~/.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