代码之家  ›  专栏  ›  技术社区  ›  Sterling Butters

Node.js节点:将stdout捕获到字符串变量中的最简单方法

  •  0
  • Sterling Butters  · 技术社区  · 7 年前

    我有以下代码:

    const spawn = require("child_process").spawn;
    
    const netStat = spawn('netstat', ['-nat']);
    const grepPort = spawn('grep', ['3000']);
    const grepStatus = spawn('grep', ['ESTABLISHED']);
    
    console.log('Determining public ip\'s connected to port 3000');
    
    // get port 3000 from netstat
    netStat.stdout.on('data', (data) => {
      grepPort.stdin.write(data);
      });
    
    netStat.on('close', (code) => {
      if (code !== 0) {console.log(`netstat process exited with code ${code}`);}
      grepPort.stdin.end();
    });
    
    // get ESTABLISHED from port 3000
    grepPort.stdout.on('data', (data) => {
      grepStatus.stdin.write(data);
      });
    
    grepPort.on('close', (code) => {
      grepStatus.stdin.end();
    });
    
    grepStatus.stdout.on('data', (data) => {
      console.log(data.toString())
      // Store data.toString() to variable here
    });
    

    我试图将最后的数据捕获到一个字符串中,注释位于第3行到最后一行。

    编辑:

    const spawn = require("child_process").spawn;
    var port = 3000
    console.log(`Determining public ip\'s connected to port ${port}`);
    
    let output = '';
    
    const proc = spawn('sh', [
      '-c',
      `netstat -nat | grep ${port}.*ESTABLISHED | awk '{print $5}' | grep -v .*${port}`
    ]);
    
    proc.stdout.on('data', (chunk) => {
      output += chunk.toString();
    });
    
    proc.stderr.on('data', (chunk) => {
      console.log(chunk.toString());
    });
    
    proc.on('error', (err) => {
      console.error(err);
    });
    
    proc.on('exit', (code) => {
      console.log("Done");
    });
    
    console.log(output); // Should print output, no?
    

    1 回复  |  直到 7 年前
        1
  •  3
  •   jbielick    7 年前

    您可以将所有数据事件块附加到一个字符串上,并在管道结束时对其执行以下操作:

    const spawn = require('child_process').spawn;
    const proc = spawn('netstat', ['-nat']);
    
    let output = '';
    proc.stdout.on('data', (chunk) => {
      output += chunk.toString();
    });
    proc.on('exit', () => {
      console.log(output);
    });
    

    output 以空字符串开始,每次出现 data 事件(通常不止一次)可以将数据附加到该字符串,直到整个过程 exit 出口 s、 你将得到总数 stdout 输出。

    同样对于你的脚本,使用一个 spawn sh 命令使用node.js节点. 再加上上面的内容,看起来像这样:

    const spawn = require("child_process").spawn;
    
    console.log('Determining public ip\'s connected to port 3000');
    
    let output = '';
    
    const proc = spawn('sh', [
      '-c',
      'netstat -nat | grep 3000 | grep ESTABLISHED'
    ]);
    
    proc.stdout.on('data', (chunk) => {
      output += chunk.toString();
    });
    
    proc.stderr.on('data', (chunk) => {
      console.log(chunk.toString());
    });
    
    proc.on('error', (err) => {
      console.error(err);
    });
    
    proc.on('exit', (code) => {
      console.log(code);
      console.log(output);
    });
    

    产卵 s、 使用内置的 .pipe

    const spawn = require("child_process").spawn;
    
    console.log('Determining public ip\'s connected to port 3000');
    
    let output = '';
    
    const netStat = spawn('netstat', ['-nat']);
    const grepPort = spawn('grep', ['3000']);
    netStat.stdout.pipe(grepPort.stdin);
    const grepStatus = spawn('grep', ['ESTABLISHED']);
    grepPort.stdout.pipe(grepStatus.stdin);
    
    grepPort.stdout.on('data', (chunk) => {
      output += chunk.toString();
    });
    
    netstat.stderr.on('data', (chunk) => {
      console.log(chunk.toString());
    });
    
    grepPort.on('error', (err) => {
      console.error(err);
    });
    
    grepPort.on('exit', (code) => {
      console.log(code);
      console.log(output);
    });
    

    我发现这个错误在本地很容易发生,因为进程可能在连接管道之前退出(例如。 grep stdin 有点像 grep -f - 否则它将退出,状态代码为1)。此外,每个管道都可以 stderr 数据 你应该听的事情。这是一个处理,所以所有管道在一起可能会有帮助。

    格雷普线 如果对你的系统起作用的话也要简单些, grep '3000.*ESTABLISHED'