在 Windows 上,设置 options.detached 为 true 可以使子进程在父进程退出后继续运行。
子进程有自己的控制台窗口。
一旦为子进程启用它,则无法被禁用。
在非 Windows 平台上,如果 options.detached 设为 true,则子进程会成为新的进程组和会话的主导者。
子进程在父进程退出后可以继续运行,不管它们是否被分离。
详见 setsid(2)。
默认情况下,父进程会等待被分离的子进程退出。
为了防止父进程等待 subprocess,可以使用 subprocess.unref() 方法。
这样做会使父进程的事件循环不会将子进程包含在其引用计数中,使得父进程可以独立于子进程退出,除非子进程和父进程之间建立了 IPC 通道。
当使用 detached 选项来启动长期运行的进程时,该进程在父进程退出后不会保持在后台运行,除非提供不连接到父进程的 stdio 配置。
如果父进程的 stdio 是继承的,则子进程会保持绑定到控制终端。
示例,一个长期运行的进程,为了忽视父进程的终止,通过分离且忽视其父进程的 stdio 文件描述符来实现:
const { spawn } = require('child_process');const subprocess = spawn(process.argv[0], ['child_program.js'], {detached: true,stdio: 'ignore'});subprocess.unref();
也可以重定向子进程的输出到文件:
const fs = require('fs');const { spawn } = require('child_process');const out = fs.openSync('./out.log', 'a');const err = fs.openSync('./out.log', 'a');const subprocess = spawn('prg', [], {detached: true,stdio: [ 'ignore', out, err ]});subprocess.unref();
