首页 > 解决方案 > Node.js 子进程执行返回:错误: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

响应在大约 187 毫秒内返回,因此它不是超时... 理论:

谢谢 !

标签: javascriptnode.jschild-process

解决方案


阅读错误消息,看起来错误是因为您的标准输出大小大于 NodeJS 中的默认值。

根据此文档,您可以按如下方式增加输出缓冲区大小:

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

此外,您始终可以检查输出字节大小以确认 bufferSize 是问题所在。这有助于确定是否maxBuffer需要增加。


推荐阅读