一段时间后NodeJS exec停止运行而没有错误

时间:2018-11-28 13:49:29

标签: javascript node.js bash file exec

我正在使用exec中的child_process

该函数运行良好,但是在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);
        });

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

谢谢

1 个答案:

答案 0 :(得分:0)

我发现了问题,不建议将exec用于大型输出,因为它使用的是有限大小的缓冲区。使用spawn代替:

  

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

     

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

     

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

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