我必须在 Node 中调用一个命令,然后基本上移交给该命令的 stdio,因此当生成子进程并将
stdio
选项设置为 inherit
时,我得到的正是我所追求的行为。
也就是说,父进程一直在运行,直到子进程退出,虽然这可能并不重要,但我真的更愿意退出父进程,因为不再需要它。
我发现我可以通过在生成子进程后立即调用
child.unref()
来做到这一点,但是在执行此操作时我遇到了一些非常奇怪的行为。
例如:
var child = child_process.spawn('irb', [], {
detached: true,
stdio: 'inherit'
});
child.unref();
irb repl 正在运行并且父进程已退出,但是当在 irb repl 中输入
quit
时,我得到:
qNameError: undefined local variable or method `uit' for main:Object
from (irb):1
from /Users/RayViljoen/.rvm/rubies/ruby-1.9.3-p385/bin/irb:16:in `<main>'
这只是示例之一,用 irb 代替 Node 或 Coffee 也有类似的效果。事实上,这个问题似乎与大多数交互式控制台作为子进程生成然后从父进程中删除类似。
有人经历过这种情况或知道如何正确执行此操作吗?
我很确定“继承”选项正在将您的节点进程变成管道,以便将 io 路由到子进程...如果您切断当前进程,该管道就会被切断...节点非常在管道流量方面效率很高,如果您的脚本不太复杂,您可以在运行子进程之前最大限度地减少非 GC 对象的数量。我不会太担心让它继续存在。
stdio: 'ignore'
对我有用。完整的调用如下所示:
const childProcess = spawn( command, [], {
shell: true,
detached: true,
stdio: 'ignore'
} );