我正在使用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);
});
什么可能导致脚本停止?有什么想法吗?
谢谢
答案 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