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左右返回响应,所以不是超时...
理论:
- 这可能是对 stdout 可能大小的限制吗?
- 是否与我的命令使用 sudo 有关?
谢谢!
看了报错信息,好像是因为你的标准输出大小比NodeJS中的默认值大。
基于此documentation,您可以按如下方式增加输出缓冲区大小:
const bufferSize = 1024 * 2048; // (default 1024 * 1024, double up)
exec(command, {maxBuffer: bufferSize}, function(error, stdout, stderr){
callback(error, stdout);
});
此外,您可以随时确认bufferSize是问题所在。这有助于确定 maxBuffer
是否需要递增。
我公开并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左右返回响应,所以不是超时... 理论:
- 这可能是对 stdout 可能大小的限制吗?
- 是否与我的命令使用 sudo 有关?
谢谢!
看了报错信息,好像是因为你的标准输出大小比NodeJS中的默认值大。
基于此documentation,您可以按如下方式增加输出缓冲区大小:
const bufferSize = 1024 * 2048; // (default 1024 * 1024, double up)
exec(command, {maxBuffer: bufferSize}, function(error, stdout, stderr){
callback(error, stdout);
});
此外,您可以随时maxBuffer
是否需要递增。