【问题标题】:NodeJS exec stop after some time without error一段时间后NodeJS exec停止没有错误
【发布时间】:2018-11-28 13:49:28
【问题描述】:

我正在使用来自child_processexec

该函数运行良好,但在 4-5 分钟后,它就停止了,没有报告任何错误,但脚本应该运行至少 24 小时...

代码如下:

import { exec } from 'child_process';

function searchDirectory(dirPath) {
    let lineBuffer = '';

    const cmd = `find ${dirPath} -type f -name "*.txt" | pv -l -L 10 -q`;
    const findData = exec(cmd);

    findData.on('error', err => log.error(err));
    findData.stdout.on('data', data => {
        lineBuffer += data;
        let lines = lineBuffer.split('\n');
        for (var i = 0; i < lines.length - 1; i++) {
            let filepath = lines[i];

            processfile(filepath);
        }
        lineBuffer = lines[lines.length - 1];
    });
    findData.stdout.on('end', () => console.log('finished finding...'));
}

pv 命令会减慢输出速度,我需要这个,因为我找到的路径是通过网络并且速度非常慢(60mb/s)。

当我直接在终端中运行命令时,它运行良好(我没有等待 24 小时,但我让它等待了半小时,它仍在运行)。

processfile 函数实际上使用axios 进行异步调用以将一些数据发送到服务器:

    let data = readFileSync(file);
    ...
    axios.post(API_URL, { obj: data }, { proxy: false })
        .then(res => {
            log.info('Successfully saved object : ' + res.data._id);
        })
        .catch(err => {
            log.error(err.response ? err.response.data : err);
        });

什么可能导致脚本停止?有什么想法吗?

谢谢

【问题讨论】:

    标签: javascript node.js bash file exec


    【解决方案1】:

    我发现了问题,不建议将exec 用于大量输出,因为它使用的缓冲区大小有限。请改用spawn

    child_process.spawn 和 child_process.exec 在他们返回的内容中 - spawn 返回一个流并且 exec 返回一个缓冲区。

    child_process.spawn 返回一个带有 stdout 和 stderr 流的对象。 您可以点击标准输出流来读取子进程的数据 发送回节点。作为流的标准输出具有“数据”、“结束”和 流具有的其他事件。 spawn 最好在你想要的时候使用 子进程向Node返回大量数据 - image 处理、读取二进制数据等

    child_process.exec 返回子进程的整个缓冲区输出 过程。默认情况下,缓冲区大小设置为 200k。如果孩子 进程返回除此之外的任何内容,您的程序将崩溃 错误消息“错误:超出最大缓冲区”。你可以解决这个问题 通过在 exec 选项中设置更大的缓冲区大小来解决问题。但是你 不应该这样做,因为 exec 不适用于返回的进程 巨大的节点缓冲区。你应该使用 spawn 。那你怎么办 使用 exec 吗?使用它来运行返回结果状态的程序, 而不是数据。

    来自:https://www.hacksparrow.com/difference-between-spawn-and-exec-of-node-js-child_process.html

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-05-23
      • 2023-03-23
      • 2017-07-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-08-19
      相关资源
      最近更新 更多