开始后分离一个生成子进程

欧普斯

我以这种方式启动生成子进程:

let process = spawn(apiPath, {
  detached: true
})

process.unref()

process.stdout.on('data', data => { /* do something */ })

当我开始该过程时,我需要使其保持连接状态,因为我想读取其输出。但是在关闭我的Node进程(父进程)之前,我想分离所有未完成的子进程以使其在后台运行,但是正如文档所述

使用分离选项启动长时间运行的进程时,除非父进程没有提供未连接到父进程的stdio配置,否则该进程将在父进程退出后不会在后台继续运行。

但是,使用该选项,stdio: 'ignore'我无法读取,stdout这是一个问题。

我尝试在关闭父进程之前手动关闭管道,但未成功:

// Trigger just before the main process end
process.stdin.end()
process.stderr.unpipe()
process.stdout.unpipe()
欧普斯

经过多次测试,我发现了至少一种解决此问题的方法:在离开主流程之前销毁所有管道。

棘手的一点是,子进程必须正确处理销毁管道的情况,否则可能会出错并仍然关闭。在此示例中,节点子进程似乎对此没有问题,但与其他情况可能有所不同。

main.js

const { spawn } = require('child_process')

console.log('Start Main')

let child = spawn('node', ['child.js'], { detached: true })
child.unref() // With this the main process end after fully disconnect the child

child.stdout.on('data', data => {
  console.log(`Got data : ${data}`)
})

// In real case should be triggered just before the end of the main process
setTimeout(() => {
  console.log('Disconnect the child')

  child.stderr.unpipe()
  child.stderr.destroy()
  child.stdout.unpipe()
  child.stdout.destroy()
  child.stdin.end()
  child.stdin.destroy()
}, 5000)

child.js

console.log('Start Child')

setInterval(function() {
   process.stdout.write('hello from child')
}, 1000)

输出

开始主要
数据:开始子

获得数据:来自子项的问候
获得数据:来自子项的问候
获得数据:来自子项的问候
获得数据:来自子项的问候
断开子项的连接

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

在node.js中生成一个子进程,数据未定义

来自分类Dev

在node.js中生成一个子进程

来自分类Dev

创建一个生成异步 Python 子进程的节点/express API

来自分类Dev

Bash 脚本运行一个分离的循环,顺序启动后台进程

来自分类Dev

python子进程-分离进程

来自分类Dev

如何从给定的一个开始生成许多随机向量

来自分类Dev

如何从给定的一个开始生成许多随机向量

来自分类Dev

在Electron中产生一个子进程

来自分类Dev

采用另一个进程的子窗口

来自分类Dev

当另一个子进程完成时,如何终止子进程?

来自分类Dev

使用python multiprocessing子进程如何终止另一个子进程?

来自分类Dev

如何区分一个子进程与其他子进程

来自分类Dev

如何强制2个Python子进程一个接一个地运行

来自分类Dev

如何强制2个Python子进程一个接一个地运行

来自分类Dev

在最后一个空格后分割字符串

来自分类Dev

父进程有多个子进程,而两个子进程有一个子进程

来自分类Dev

把一个函数变成一个子进程——STUCK

来自分类Dev

python:子进程调用一个脚本,该脚本运行一个挂起的后台进程

来自分类Dev

Python杀死一个子进程(启动另一个进程)并再次启动

来自分类Dev

如何从一个随机字节开始在一个间隔内生成一个整数随机值

来自分类Dev

我如何以一个很好的值-20开始一个进程,而不给它root特权?

来自分类Dev

如何减少Linux上一个进程的所有线程(和子进程)?

来自分类Dev

如何减少Linux上一个进程的所有线程(和子进程)?

来自分类Dev

子进程中的Ctrl + c会在脚本的前面杀死一个nohup'ed进程

来自分类Dev

如果已知父进程,如何获取一个非常短的子进程的ID?

来自分类Dev

多人纸牌游戏-启动子进程或在一个进程中处理

来自分类Dev

Shell函数来检查是否有一个挂起的进程是该Shell的子进程?

来自分类Dev

如何使用htop挂起一个进程及其所有子进程?

来自分类Dev

子进程从其父进程继承了一个句柄但未能写入其中

Related 相关文章

  1. 1

    在node.js中生成一个子进程,数据未定义

  2. 2

    在node.js中生成一个子进程

  3. 3

    创建一个生成异步 Python 子进程的节点/express API

  4. 4

    Bash 脚本运行一个分离的循环,顺序启动后台进程

  5. 5

    python子进程-分离进程

  6. 6

    如何从给定的一个开始生成许多随机向量

  7. 7

    如何从给定的一个开始生成许多随机向量

  8. 8

    在Electron中产生一个子进程

  9. 9

    采用另一个进程的子窗口

  10. 10

    当另一个子进程完成时,如何终止子进程?

  11. 11

    使用python multiprocessing子进程如何终止另一个子进程?

  12. 12

    如何区分一个子进程与其他子进程

  13. 13

    如何强制2个Python子进程一个接一个地运行

  14. 14

    如何强制2个Python子进程一个接一个地运行

  15. 15

    在最后一个空格后分割字符串

  16. 16

    父进程有多个子进程,而两个子进程有一个子进程

  17. 17

    把一个函数变成一个子进程——STUCK

  18. 18

    python:子进程调用一个脚本,该脚本运行一个挂起的后台进程

  19. 19

    Python杀死一个子进程(启动另一个进程)并再次启动

  20. 20

    如何从一个随机字节开始在一个间隔内生成一个整数随机值

  21. 21

    我如何以一个很好的值-20开始一个进程,而不给它root特权?

  22. 22

    如何减少Linux上一个进程的所有线程(和子进程)?

  23. 23

    如何减少Linux上一个进程的所有线程(和子进程)?

  24. 24

    子进程中的Ctrl + c会在脚本的前面杀死一个nohup'ed进程

  25. 25

    如果已知父进程,如何获取一个非常短的子进程的ID?

  26. 26

    多人纸牌游戏-启动子进程或在一个进程中处理

  27. 27

    Shell函数来检查是否有一个挂起的进程是该Shell的子进程?

  28. 28

    如何使用htop挂起一个进程及其所有子进程?

  29. 29

    子进程从其父进程继承了一个句柄但未能写入其中

热门标签

归档