2012-06-04 9 views
11

capistrano görevfırlatma arka plan işlemi

namespace :service do 
    desc "start daemontools (svscan/supervise/svscanboot)" 
    task :start, :roles => :app do 
    sudo "svscanboot&" 
    end 
end 

Şimdi bu işe yaramazsa: svscanboot süreci basitçe çalışmaz. https://github.com/defunkt/resque/issues/284 diğer kaynaklar nohup, redirection ve pty => true beni işaret etti, bu yüzden tüm bu çalıştı: Bu beni sleep bulmak yardımcı oldu.

run "nohup svscanboot >/tmp/svscanboot.log 2>&1 &" # NO 
run "(svscanboot&) && sleep 1"      # NO 
run "(nohup svscanboot&) && sleep 1"     # YES! 

Şimdi, herkes neden uyku ifadesine ihtiyacım olduğunu ve nohup'un ne gibi bir fark yarattığını açıklayabilir mi? Kullanıcı kabuğundan çalıştırılırsa, yukarıdaki tüm işlemler eşit derecede iyi kayıt için sorun yalnızca kapistrano bağlamındadır.

sayesinde

+0

'nohup', komutunuz sonlandıktan sonra komutunuzun" SIGHUP "sinyalini aldığında sona erdirilmemesini sağlar. Ancak, aynı zamanda uyku komutunun neden bir fark yarattığını merak ediyorum. – Graeme

+0

Uyku, dünyamda da bir fark yaratıyor. Capistrano ile bu kadar basit bir görevin neden bu kadar şaşırtıcı bir şekilde zor olduğunu anlamak mistik. – cbmanica

+0

Aynı davranışı görüyorum. Ve aynı şeyi de merak ediyorum. – aslakjo

cevap

0

Bence nohup sadece arka planda işlemi başlatıyor, bu yüzden son 01'i açıkça ayarlamanıza gerek yok.

sen (arka plana göndermek için biten & olmadan)

run "nohup svscanboot >/tmp/svscanboot.log 2>&1"

deneyin yaptı.

Geçerli capistrano oturumunuz kapalıyken çalışmalı ve çalışmaya devam etmelidir.

0

bu

run "nohup svscanboot >/tmp/svscanboot.log 2>&1 & sleep 5", pty: false 
0
Birden komutları çalıştırırken da çalışır benim çözüm paylaşmak istiyorum

deneyin. İnternette bulunan ve "sleep N" kesmek de dahil olmak üzere birçok başka varyantı denedim.

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) 
1

Benim basit bir çözüm çalıştırmak istediğiniz ne olursa olsun kod ile uzak sunucuya en svscanboot.sh dosyasını yapmak olacaktır. kap tırmık görevi davanıza

svscanboot >/tmp/svscanboot.log 2>&1 

bu benim için iyi çalışıyor bu

run "sh +x somefile.sh &" 

ekleyin.