2014-10-18 29 views
5

Jestem całkiem nowy w skryptach bash, ale wydaje mi się, że naprawdę brakuje tu czegoś podstawowego. Próbuję ledwo zmodyfikowanej wersji Mike Perham's upstart sidekiq script na maszynie Ubuntu 14.04, ale prawie nic nie jest oceniany zgodnie z oczekiwaniami:Czy zmieniły się skrypty upstart lub bash w systemie Ubuntu 14.04? (Próbuję załadować sidekiq z dodatkiem)

  • eksport nie wydaje się działać
  • źródło nie wydaje się, aby ocenić moja zmieniła zmienna PATH w .bashrc lub uruchamiając polecenie startowy rbenv
  • cd nie wydaje się, aby zmienić katalogi, chyba że polecenie $ (pwd) nie jest właściwy sposób ocenić jej

Oto mój zmodyfikowany skrypt:

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

Oto wyjście uzyskać w pliku dziennika dorobkiewicz:

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 
+3

Wypróbuj 'exec/bin/bash << 'EOT'' (twarde cytaty wokół znacznika). Wynik powinien mieć więcej sensu. – Mat

+0

W porządku! Dzięki, twarde cytaty pomogły. Teraz HOME jest eksportowany, a cd faktycznie zmienia katalog ... Teraz muszę tylko wymyślić, jak poprawnie załadować plik .bashrc, lub zainicjować rbenv w inny sposób – Josh

Odpowiedz

15

2 Zmiany wykonana cała różnica:

1) Dodaj twarde cytaty do EOT w exec /bin/bash << 'EOT' (kredytu Mat dzięki!)

2) Zamiast ładowania .bashrc za pomocą źródła, dodaj linie rbenv z .bashrc bezpośrednio do skryptu upstart. Wymienić source /home/deploy/.bashrc z:

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

nie mam pojęcia, dlaczego te dwie zmiany robią różnicę, a jeśli to jest podobne do nowszej wersji Ubuntu, nowobogackich lub bash. Jeśli ktoś może wyjaśnić, proszę kurant

podaję moje pełne skrypt pracy dla każdego, po prostu patrząc na odpowiedź.

# /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 
+1

Proszę przesłać PR, dzięki czemu możemy uzyskać ten stały upstream! –

+1

Korzystałbym bezpośrednio z pomocy ENV dla Upstart: http://upstart.ubuntu.com/cookbook/#env env HOME =/home/deploy –

+0

Chciałbym móc pobrać .bashrc z wnętrza skryptu Upstart. To niewiarygodnie denerwujące, że musisz wstawić env vars w dwóch miejscach podczas udostępniania aplikacji. – odigity

3

Domyślną .bashrc na Ubuntu 14.04 ma kilka linii do niezwłocznego zwrotu jeśli powłoka działa w trybie nieinteraktywnym. Kiedy usuniesz te linie ze swojego bashrc, wtedy source będzie działało zgodnie z oczekiwaniami w nowobudowanym.

~/.bashrc (linie do usunięcia)

# If not running interactively, don't do anything 
case $- in 
    *i*) ;; 
     *) return;; 
esac 
+0

Używam wersji 14.04.4, a wiersz, który skomentowałem z .bashrc to '[-z" $ PS1 "] && return'. To pozwoliło mi po prostu pobrać plik .bashrc w skrypcie upstart. Dzięki za wskazówkę! –

0

rozwiązanie Josha nie pracują dla mnie na ubuntu 14.04 korzystających rbenv. To jednak zadziałało:

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