【问题标题】:How to run long running commands with pipes using Node.js child_process spawn [Edit: Especially piping into grep]如何使用 Node.js child_process spawn 使用管道运行长时间运行的命令 [编辑:尤其是管道进入 grep]
【发布时间】:2020-09-10 16:13:46
【问题描述】:

考虑下面的一个简单示例,在该示例中,我在发送一个长时间运行的命令时打印响应。

const { spawn } = require('child_process');

const ping = spawn('ping', ['www.google.com']);

ping.stdout.on('data', (data) => {
    console.log(`stdout: ${data}`);
});

ping.stderr.on('data', (data) => {
    console.error(`stderr: ${data}`);
});

ping.on('close', (code) => {
    if (code !== 0) {
        console.log(`ping process exited with code ${code}`);
    }
});

这工作正常。但是,当我尝试将此结果通过管道传输到 grep 时,它会停止工作。 请参阅下面的示例

const { spawn } = require('child_process');

const ping = spawn('ping', ['www.google.com']);
const grep = spawn('grep', ['bytes'])

ping.stdout.on('data', (data) => {
    grep.stdin.write(data)
});

ping.stderr.on('data', (data) => {
    console.error(`stderr: ${data}`);
});

ping.on('close', (code) => {
    if (code !== 0) {
        console.log(`ping process exited with code ${code}`);
    }
    grep.stdin.end();
});

grep.stdout.on('data', (data) => {
    console.log(`stdout: ${data}`);
});

grep.stderr.on('data', (data) => {
    console.error(`stderr: ${data}`);
});

grep.on('close', (code) => {
    console.log(`grep process exited with code ${code}`);
});

上面的代码没有给我任何结果。

看起来它正在等待第一个命令结束,然后再将结果传递给下一个。 我通过试验ls 命令观察到这一点。

管道的全部意义不在于不等待吗?还是我在这里遗漏了什么?

我尝试过的一些变化没有成功:

  • ping.stdout.pipe(grep.stdin); 而不是grep.stdin.write(data),虽然我不相信两者之间有太大区别。

  • const ping = spawn('sh', ['-c', 'ping www.google.com | grep bytes']);我已经尝试过使用非长时间运行的命令,它工作正常,包括管道和所有东西。

【问题讨论】:

    标签: node.js bash shell grep pipe


    【解决方案1】:

    问题在于grep 默认情况下会对其输出进行块缓冲,因此在有几千字节的输出可用之前,它不会将任何内容发送回节点。请注意,如果您按原样等待足够长的时间,您最终会看到几十行突然全部返回。 --line-buffered 选项改变了这一点,所以spawn('grep', ['--line-buffered', 'bytes']) 而不是spawn('grep', ['bytes'])

    【讨论】:

    • 太棒了。不知道这个关于grep。干杯
    猜你喜欢
    • 2012-12-27
    • 1970-01-01
    • 1970-01-01
    • 2023-03-19
    • 1970-01-01
    • 2016-06-07
    • 2017-04-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多