Node.js child process exec returning : Error: kill EPERM STDERR STDOUT_SIZE

Node.js child process exec returning : Error: kill EPERM STDERR STDOUT_SIZE

我公开并API 致力于打印来自 Linux System D 服务的日志。这是代码示例:

'use strict';
const exec = require('child_process').exec;
const express = require('express');

var router = express.Router();
router.get('/printlogs', function (req, res) {

//simplified for Stack Overflow
var completeCmd = "sudo journalctl -u node-myapp@serveruser --no-pager --since \"2020-06-31 00:00:00\"";

exec(completeCmd, (error, stdout, stderr) => {

    var status = 0;
    var response = "";

    if (error) {
        console.log("Error !");
        console.log("ERROR : " + error);
        console.log("STDERR : " + stderr);
        console.log("STDOUT_SIZE : " + stdout.length);
        status = 500;
        response = stderr;
    } else {
        console.log("Success !");
        status = 200;
        response = stdout;
    }

    res.contentType('text/plain').status(status);
    res.send(response);
    });
});
module.exports = router;

如果“completeCmd”中的日期足够接近(例如:最近 10 天),一切正常...如果日期太早(例如:3 个月前),该过程会以一种奇怪的方式失败:

Error !
ERROR : Error: kill EPERM
STDERR : 
STDOUT_SIZE : 1046013

187ms左右返回响应,所以不是超时... 理论:

谢谢!

看了报错信息,好像是因为你的标准输出大小比NodeJS中的默认值大。

基于此documentation,您可以按如下方式增加输出缓冲区大小:

const bufferSize = 1024 * 2048; // (default 1024 * 1024, double up)
exec(command, {maxBuffer: bufferSize}, function(error, stdout, stderr){ 
  callback(error, stdout); 
});

此外,您可以随时确认bufferSize是问题所在。这有助于确定 maxBuffer 是否需要递增。