2009-07-10 31 views
19

Đối với ứng dụng RubyOnRails-App của tôi, tôi phải bắt đầu một công việc nền khi kết thúc quá trình triển khai Capistrano. Đối với điều này, tôi đã thử sau đây trong deploy.rb:Khởi động các tác vụ nền với Capistrano

run "nohup #{current_path}/script/runner -e production 'Scheduler.start' &", :pty => true 

Đôi khi làm việc này, nhưng phần lớn thời gian nó không bắt đầu quá trình (= không được liệt kê trong ps -aux). Và không có thông báo lỗi. Và không có nohup.out, không có trong thư mục chính và không nằm trong thư mục ứng dụng đường ray.

Tôi đã thử sử dụng bẫy ('SIGHUP', 'IGNORE') trong scheduler.rb thay vì nohup, nhưng kết quả là như nhau.

Cách duy nhất để làm việc đó là xóa ": pty => true" và thực hiện Ctrl-C thủ công ở cuối "triển khai giới hạn". Nhưng tôi không thích điều này ...

Có cơ hội nào khác để gọi ra Scheduler.start này không? Hoặc để nhận thêm một số thông báo lỗi?

Tôi đang sử dụng Rails 2.3.2, 2.5.8 Capistrano, Ubuntu Hardy trên Server

+0

Bất kỳ gợi ý nào? Vẫn đang đấu tranh với việc khởi động lại nền ở đây ... –

Trả lời

1

Bạn có muốn công việc Scheduler của bạn chạy liên tục trong nền và được khởi động lại khi bạn chạy Capistrano?

Nếu vậy, thì cho rằng tôi sử dụng runit http://smarden.sunsite.dk/runit/ và DelayedJob http://github.com/Shopify/delayed_job/tree/master

  1. Install runit ở chế độ không thay thế init
  2. Thêm công việc nền của bạn như một dịch vụ runit và thêm màn hình đăng nhập cho nó từ runit.
  3. Gọi Capistrano sudo sv kill job_name để giết và khởi động lại công việc.

Công việc backround của tôi là một ví dụ của plugin Rails DelayedJob xử lý các tác vụ Rails nền. Tôi giết nó với mỗi Capistrano triển khai để nó sẽ khởi động lại với cơ sở mã cập nhật.

Điều này đã được chứng minh là rất đáng tin cậy.

HTH,

Larry

+0

Có, trình lập lịch nên chạy liên tục trong nền và nên khởi động lại trên mọi triển khai. Im sử dụng DelayedJob trong trình lên lịch - và một số nội dung của riêng nó. Bởi vì bắt đầu qua script/runner đôi khi với Capistrano (và luôn luôn nếu tôi bắt đầu nó theo cách thủ công thông qua một phiên SSH) Tôi nghĩ rằng chỉ có một vấn đề nhỏ với Capistrano - và vì vậy tôi không muốn chuyển sang runit, nếu nó không thực sự cần thiết ... Nhưng cảm ơn bạn rất nhiều vì đã cho anwer, Larry! –

+0

Điều gì về tự động khởi động lại khi khởi động lại? Đó là cái gì khác mà runit chăm sóc. - Cộng với khởi động lại nếu nó đã từng chết. Trân trọng. –

+0

@Georg: Nếu bạn thích câu trả lời của Larry, vui lòng upvote –

14

Với: pty => đúng, sử dụng vỏ khởi động kịch bản (ví dụ bashrc, vv) được (thường) không được nạp. Chương trình ruby ​​của tôi đã thoát ngay sau khi khởi chạy vì thiếu các biến môi trường phụ thuộc.

Không có: pty => true, như bạn đã mô tả trong câu hỏi, capistrano treo ở đó chờ quá trình thoát. Bạn sẽ cần phải chuyển hướng cả stdout và stderr để làm cho nó trở lại ngay lập tức.

run 'nohup ruby -e "sleep 5" &' # hangs for 5 seconds 
run 'nohup ruby -e "sleep 5" > /dev/null &' # hangs for 5 seconds 
run 'nohup ruby -e "sleep 5" > /dev/null 2>&1 &' # returns immediately. good. 

Nếu tác vụ nền của bạn vẫn không chạy. Hãy thử chuyển hướng stdout và stderr sang tệp nhật ký để bạn có thể điều tra đầu ra.

+1

Tôi đã vật lộn cả ngày với cùng một vấn đề. Chuyển hướng đầu ra theo đề xuất đã giải quyết được sự cố. – randomuser

1

Nếu trình lên lịch nhiệm vụ này có công tắc -d thì nó sẽ hoạt động. Ví dụ như hành khách độc lập có một tùy chọn -d để bắt đầu nó như là một quá trình demonized.

namespace :passenger_standalone do 
    task :start do 
    run "cd #{current_path} && passenger start -e #{rails_env} -d" 
    end 
    task :stop do 
    run "cd #{current_path} && RAILS_ENV=#{rails_env} passenger stop" 
    end 
    task :restart do 
    stop 
    start 
    end 
end 
6

Tôi muốn chia sẻ giải pháp của mình cũng hoạt động khi thực hiện nhiều lệnh. Tôi đã thử nhiều biến thể khác được tìm thấy trực tuyến, kể cả hack "ngủ N".

run("nohup sh -c 'cd #{release_path} && bundle exec rake task_namespace:task_name RAILS_ENV=production > ~/shared/log/<rakelog>.log &' > /dev/null 2>&1", :pty => true) 

Đây là một phản ứng dup launching background process in capistrano task nhưng muốn chắc chắn những người khác và bản thân mình có thể google cho giải pháp này.

+0

Điều đó đã giúp tôi. Cám ơn. –

Các vấn đề liên quan