Я запускаю дочерний процесс порождения следующим образом:
let process = spawn(apiPath, {
detached: true
})
process.unref()
process.stdout.on('data', data => { /* do something */ })
Когда я запускаю процесс, мне нужно держать его подключенным, потому что я хочу прочитать его вывод. Но перед закрытием моего процесса Node (родительского) я хочу отсоединить все незавершенные дочерние процессы, чтобы они работали в фоновом режиме, но, как сказано в документации :
При использовании опции detached для запуска длительного процесса он не будет работать в фоновом режиме после выхода из родительского процесса, если ему не предоставлена конфигурация stdio, которая не подключена к родительскому процессу.
Но с опцией stdio: 'ignore'
я не могу прочитать, stdout
что является проблемой.
Я пытался вручную закрыть каналы, прежде чем закрыть родительский процесс, но это не удалось:
// Trigger just before the main process end
process.stdin.end()
process.stderr.unpipe()
process.stdout.unpipe()
node.js
multithreading
spawn
Opsse
источник
источник
Ответы:
После многих тестов я нашел хотя бы один способ решить эту проблему: уничтожить все трубы, прежде чем покинуть основной процесс.
Одна хитрость в том, что дочерний процесс должен правильно обрабатывать разрушающиеся каналы, в противном случае он может получить ошибку и закрыть в любом случае. В этом примере кажется, что у дочернего процесса узла нет проблем с этим, но он может отличаться от других сценариев.
main.js
child.js
вывод
источник