Eu inicio um processo filho spawn desta maneira:
let process = spawn(apiPath, {
detached: true
})
process.unref()
process.stdout.on('data', data => { /* do something */ })
Quando inicio o processo, preciso mantê-lo anexado, porque quero ler sua saída. Mas, pouco antes de fechar meu processo Node (o pai), quero desanexar todos os processos filhos não concluídos para mantê-los em execução em segundo plano, mas como a documentação diz:
Ao usar a opção desanexada para iniciar um processo de longa execução, o processo não continuará sendo executado em segundo plano após a saída do pai, a menos que seja fornecida uma configuração stdio que não esteja conectada ao pai.
Mas com a opção stdio: 'ignore'
não consigo ler o stdout
que é um problema.
Tentei fechar manualmente os pipes antes para fechar o processo pai, mas não obtive êxito:
// Trigger just before the main process end
process.stdin.end()
process.stderr.unpipe()
process.stdout.unpipe()
node.js
multithreading
spawn
Opsse
fonte
fonte
Respostas:
Depois de muitos testes, encontrei pelo menos uma maneira de resolver esse problema: destruir todos os canos antes de sair do processo principal.
Um ponto complicado é que o processo filho precisa manipular corretamente os canos destruidores; caso contrário, pode haver um erro e fechar de qualquer maneira. Neste exemplo, o processo filho do nó parece não ter problemas com isso, mas pode ser diferente com outro cenário.
main.js
child.js
resultado
fonte