2015-06-08 24 views
8

Ubuntu üzerinde çalışan Node.JS uygulamasından bir komut dosyasını başlatmak için child_process.spawn() kullanıyorum. Bildiğim kadarıyla, standart çatallı veya yumurtlu * nix süreçleri genellikle ebeveyn öldüğünde ölmezler, ancak Node.JS'den kaynaklanan yumurtlama süreçlerinde, uygulamam çöktüğünde ya da ctrl-c vb.Node.JS alt süreçler öldüğünde öldürülürken çocuk süreçleri

Bu neden ve bunun bir yolu var mı? Child_process API'sinde belirgin bir seçenek bulamıyorum.

Uygulamam, arka planda çalışması gereken oldukça uzun süren bazı görevleri başlatır; düğüm sunucum çöker veya başka bir nedenle yeniden başlatılırsa, görevleri kesmek istemiyorum, bunun yerine düğüm sunucusunu istiyorum. Geri dönün ve bu çalışan görevlerin ilerlemesini izlemeye incelikle devam edin.

cevap

17

Eğer müstakil seçenek ayarlanırsa müstakil seçenekle

ayarlamanız gerekir, alt süreç yeni bir süreç grubunun lideri yapılacaktır. Bu, çocuğun çıkışından sonra 'un çalışmaya devam etmesini sağlar.

var child = spawn('prg', [], { 
    detached: true, 
    stdio: [ 'ignore', out, err ] 
}); 
+2

Çok teşekkürler. Bilmiyorum NASIL bunu kaçırmayı başardım. Referans için, eğer birisi bu cevabı yararlı bulursa, el kitabından: https://nodejs.org/api/child_process.html#child_process_options_detached – JHH

+0

Bir endişem var. Elkitabı - ve kod - özellikle stdio'nun, işlemin arka planda devam etmesi için ana işlemden (varsayılan olan) başka bir yere yönlendirilmesi gerektiğini söyler. Ancak, herhangi bir stdio seçeneği belirtmemiş olsam bile, düğüm sunucumu öldürdüğümde bile işlemin devam ettiğini gördüm. Burada tam olarak ne olduğundan emin değilim, ama belki ['görmezden gel', 'görmezden gel', 'görmezden gel'] yine de akıllıca bir seçenektir. – JHH

+1

stdio'nun belirtilmemesi stdio'nun varsayılanı olacaktır: ['boru', 'boru', 'boru'] ... Bu, boruların ChildProcess.stdin, ChildProcess.stdout ve ChildProcess.stderr aracılığıyla kullanılabileceği anlamına gelir (bu durumda ** düşünün ** stdout ve stderr'den okumalısınız, aksi takdirde çocuk işleminiz askıya alınabilir) ... eğer çocuk süreçlerinin stdio'sunu ana işlemden geçirmeniz gerekmiyorsa, o zaman sadece 'ignore' kullanabilirsiniz. childprocess to/dev/null – Johny

İlgili konular