将 stdout/stderr 从 child_process 重定向到 /dev/null 或类似的东西

Redirect stdout/stderr from a child_process to /dev/null or something similar

我正在用 Node.js (require('child_process')) 创建一些 child_processes,我想确保每个 child_process 的 stdout/stderr 不会转到终端,因为我只想记录父进程的输出。有没有办法将 child_processes 中的 stdout/stderr 流重定向到 /dev/null 或其他不是终端的地方?

https://nodejs.org/api/child_process.html

也许只是:

var n = cp.fork('child.js',[],{
   stdio: ['ignore','ignore','ignore']
});

我刚刚试过了,但似乎没有用。

现在我尝试了这个:

var stdout, stderr;

if (os.platform() === 'win32') {
    stdout = fs.openSync('NUL', 'a');
    stderr = fs.openSync('NUL', 'a');
}
else {
    stdout = fs.openSync('/dev/null', 'a');
    stderr = fs.openSync('/dev/null', 'a');
}

然后这个选项:

stdio: ['ignore',  stdout, stderr],

但这并没有做到,但似乎使用 "detached:true" 选项可能会成功。

解决方案:

丢弃分叉子进程的 stdoutstderr

  1. 设置一个pipe,即在分叉时使用silent = True

  2. 并将父进程上的 stdoutstderr 管道重定向到 /dev/null.


解释:

node.js documentation states :

为方便起见,options.stdio可能是以下字符串之一:

'pipe' - equivalent to ['pipe', 'pipe', 'pipe'] (the default)
'ignore' - equivalent to ['ignore', 'ignore', 'ignore']
'inherit' - equivalent to [process.stdin, process.stdout, process.stderr] or [0,1,2]

显然 childprocess.fork() does NOT support ignore; Only childprocess.spawn() 确实如此。

fork does support a silent option that allows one to choose between pipe OR inherit.

分叉子进程时:
如果 silent = True,则 stdio = pipe.
如果 silent = False,则 stdio = inherit.

silent
Boolean

If true, stdin, stdout, and stderr of the child will be piped to the parent, otherwise they will be inherited from the parent.

See the 'pipe' and 'inherit' options for child_process.spawn()'s stdio for more details.