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

时间:2016-02-05 04:34:16

标签: node.js stdout stderr child-process

我正在使用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”选项可能会使这个工作。

1 个答案:

答案 0 :(得分:6)

解决方案:

抛弃分叉子进程的stdoutstderr

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

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

  3. 说明:

    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() 不支持ignore;只有childprocess.spawn()

      

    fork支持silent选项,允许用户在pipeinherit之间进行选择。

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

      

    silent
       布尔

         

    如果为true,则将子节点的stdin,stdout和stderr传送给父节点,否则它们将从父节点继承。

         

    查看' pipe'并且'继承' child_process.spawn()' s stdio的选项以获取更多详细信息。