2014-10-18 15 views
5

Tôi khá mới để bash scripting, nhưng nó cảm thấy như tôi thực sự thiếu một cái gì đó cơ bản ở đây. Tôi đang cố gắng để một phiên bản sửa đổi của chỉ Mike Perham's upstart sidekiq script trên một máy tính Ubuntu 14.04, tuy nhiên hầu như không có gì đang được đánh giá như mong đợi:Các tập lệnh khởi động hoặc bash có thay đổi trên Ubuntu 14.04 không? (Cố gắng để khởi động sidekiq với mới nổi)

  • xuất khẩu dường như không được làm việc
  • nguồn dường như không đánh giá biến PATH thay đổi của tôi trong .bashrc hoặc chạy lệnh rbenv init
  • cd dường như không thay đổi thư mục, trừ khi $ (pwd) lệnh không phải là cách chính xác để đánh giá nó

Dưới đây là của tôi đã sửa đổi tập lệnh:

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

Dưới đây là kết quả tôi nhận được trong file mới nổi log:

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

Thử 'exec/bin/bash << 'EOT'' (dấu ngoặc cứng xung quanh điểm đánh dấu). Đầu ra sẽ có ý nghĩa hơn. – Mat

+0

Được rồi! Cảm ơn, dấu ngoặc kép đã giúp. Bây giờ HOME được xuất và cd thực sự thay đổi thư mục ... Bây giờ tôi chỉ cần tìm ra cách tải đúng tệp .bashrc, hoặc khởi tạo rbenv theo cách khác – Josh

Trả lời

15

2 Thay đổi được thực tất cả sự khác biệt:

1) Thêm dấu ngoặc kép khó EOT trong exec /bin/bash << 'EOT' (tín dụng cho Mat, thanks!)

2) Thay vì tải .bashrc bằng cách sử dụng nguồn, hãy thêm các dòng rbenv từ .bashrc trực tiếp vào tập lệnh khởi động. Thay source /home/deploy/.bashrc với:

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

Tôi không có ý tưởng tại sao hai thay đổi được thực sự khác biệt, và nếu điều đó có liên quan đến một phiên bản mới hơn của ubuntu, mới nổi, hoặc bash. Nếu bất cứ ai có thể giải thích, xin vui lòng kêu vang trong

Tôi đã bao gồm kịch bản làm việc đầy đủ của tôi cho bất cứ ai chỉ tìm kiếm câu trả lời:.

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

Vui lòng gửi PR để chúng ta có thể có được thượng nguồn cố định này! –

+1

Tôi sẽ sử dụng hỗ trợ ENV của Upstart trực tiếp: http://upstart.ubuntu.com/cookbook/#env env HOME =/home/deploy –

+0

Tôi ước có thể mã nguồn .bashrc từ bên trong tập lệnh Khởi động. Thật khó chịu khi phải đặt các vv env ở hai nơi khi cung cấp ứng dụng. – odigity

3

Các tập tin mặc định .bashrc trên Ubuntu 14.04 có một vài dòng để trở lại ngay lập tức nếu trình bao đang chạy ở chế độ không tương tác. Khi bạn xóa những dòng đó khỏi bashrc của bạn thì source sẽ hoạt động như dự kiến ​​trong giai đoạn mới nổi.

~/.bashrc (tuyến để loại bỏ)

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

Tôi đang chạy 14.04.4 và dòng tôi đã nhận xét của .bashrc là '[-z" $ PS1 "] && return'. Điều này cho phép tôi chỉ đơn giản là nguồn .bashrc trong kịch bản mới nổi. Cảm ơn vì tiền hỗ trợ! –

0

giải pháp của Josh không làm việc cho tôi trên ubuntu 14.04 sử dụng rbenv. Tuy nhiên, điều này đã làm việc:

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 
Các vấn đề liên quan