Saya memulai proses menelurkan anak dengan cara ini:
let process = spawn(apiPath, {
detached: true
})
process.unref()
process.stdout.on('data', data => { /* do something */ })
Ketika saya memulai proses saya harus tetap terhubung karena saya ingin membaca hasilnya. Tetapi tepat sebelum menutup proses Node saya (orang tua) saya ingin melepaskan semua proses anak yang belum selesai agar mereka tetap berjalan di latar belakang, tetapi seperti yang dikatakan dalam dokumentasi :
Saat menggunakan opsi terlepas untuk memulai proses yang berjalan lama, proses tidak akan tetap berjalan di latar belakang setelah induk keluar kecuali jika disediakan dengan konfigurasi stdio yang tidak terhubung ke induk.
Tetapi dengan pilihan stdio: 'ignore'
saya tidak bisa membaca stdout
yang merupakan masalah.
Saya mencoba untuk secara manual menutup pipa sebelum menutup proses induk tetapi tidak berhasil:
// Trigger just before the main process end
process.stdin.end()
process.stderr.unpipe()
process.stdout.unpipe()
sumber
Jawaban:
Setelah banyak tes saya menemukan setidaknya satu cara untuk menyelesaikan masalah ini: menghancurkan semua pipa sebelum meninggalkan proses utama.
Satu hal yang sulit adalah bahwa proses anak harus menangani dengan benar pipa-pipa yang menghancurkan, jika tidak bisa mendapatkan kesalahan dan tutup pula. Dalam contoh ini proses simpul anak tampaknya tidak memiliki masalah dengan ini tetapi bisa berbeda dengan skenario lainnya.
main.js
child.js
keluaran
sumber