- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
这是一个简单的 Node 程序:(注意:这只是一个示例。替换任何同时输出到 stdout 和 stderr 的程序,如果这些行乱序,它们将没有那么有用,例如 llvm、gcc、clang、少,grep等...)
const log = msg => console.log(`log: ${msg}`);
const error = msg => console.error(`error: ${msg}`);
log('line1');
error('line2');
log('line3');
error('line4');
如果我运行它,我会得到以下输出:
log: line1
error: line2
log: line3
error: line4
现在我想要
child_process.execFile
的相同输出.问题是这些行被缓冲了,所以它们不会以相同的顺序到达我这里:
const child_process = require('child_process');
const lines = [];
const ch = child_process.execFile(process.argv[0], ['main.js'], () => {
console.log(lines.join(''));
});
ch.stdout.on('data', (data) => { lines.push(data); });
ch.stderr.on('data', (data) => { lines.push(data); });
产生:
log: line1
error: line2
error: line4
log: line3
作为另一个例子,这里有一个 bash 脚本:
#!/bin/sh
echo line 1
echo line 2 >&2
echo line 3
echo line 4 >&2
并在终端中运行它的输出是:
line 1
line 2
line 3
line 4
但通过
child_process
运行它:
const child_process = require('child_process');
const lines = [];
const ch = child_process.execFile('sh', ['test.sh'], () => {
console.log(lines.join(''));
});
ch.stdout.on('data', (data) => { lines.push(data); });
ch.stderr.on('data', (data) => { lines.push(data); });
输出:
line 1
line 3
line 2
line 4
我怎样才能以相同的顺序获得这些行,并且还知道哪些来自 stdout,哪些来自 stderr?
By default, pipes for stdin, stdout, and stderr are established between the parent Node.js process and the spawned child. These pipes have limited (and platform-specific) capacity. If the child process writes to stdout in excess of that limit without the output being captured, the child process will block waiting for the pipe buffer to accept more data
maxBuffer
它说
maxBuffer Largest amount of data in bytes allowed on stdout or stderr. If exceeded, the child process is terminated and any output is truncated
maxBuffer
到 0 可能是解决方案,但显然不是。
spawn
本身有
an example in the docs但尝试一下
const child_process = require('child_process');
const lines = [];
const ch = child_process.spawn(process.argv[0], ['main.js']);
ch.stdout.on('data', (data) => {
console.log(`stdout: ${data}`);
});
ch.stderr.on('data', (data) => {
console.error(`stderr: ${data}`);
});
ch.on('close', (code) => {
console.log(`child process exited with code ${code}`);
});
导致相同的结果
stdout: log: line1
stderr: error: line2
error: line4
stdout: log: line3
child process exited with code 0
我怀疑这与制作
Writeable
有关流并通过
spawn
传入但目前尚不清楚如何做到这一点。我尝试创建一个
Writeable
并将其传入但 Node 提示
internal/child_process.js:996
throw new ERR_INVALID_OPT_VALUE('stdio', inspect(stdio));
^
TypeError [ERR_INVALID_OPT_VALUE]: The value "Writable {
_writableState: WritableState {
objectMode: false,
highWaterMark: 0,
finalCalled: false,
needDrain: false,
ending: false,
ended: false,
finished: false,
destroyed: false,
decodeStrings: true,
defaultEncoding: 'utf8',
length: 0,
writing: false,
corked: 0,
sync: true,
bufferProcessing: false,
onwrite: [Function: bound onwrite],
writecb: null,
writelen: 0,
afterWriteTickInfo: null,
bufferedRequest: null,
lastBufferedRequest: null,
pendingcb: 0,
prefinished: false,
errorEmitted: false,
emitClose: true,
autoDestroy: false,
bufferedRequestCount: 0,
corkedRequestsFree: {
next: null,
entry: null,
finish: [Function: bound onCorkedFinish]
}
},
writable: true,
_write: [Function: write],
_events: [Object: null prototype] {},
_eventsCount: 0,
_maxListeners: undefined,
[Symbol(kCapture)]: false
}" is invalid for option "stdio"
知道如何在 Node 中生成子进程时同步或至少正确地交错捕获 stdout 和 stderr 吗?
最佳答案
恐怕你所做的
const child_process = require('child_process');
const lines = [];
const ch = child_process.execFile('sh', ['test.sh'], () => {
console.log(lines.join(''));
});
ch.stdout.on('data', (data) => { lines.push(data); });
ch.stderr.on('data', (data) => { lines.push(data); });
是我们能做的最大值。您的测试脚本的问题
#!/bin/sh
echo line 1
echo line 2 >&2
echo line 3
echo line 4 >&2
是这两个字符串
"line 1\n"
和
"line 3\n"
写得这么快。
stdout
发生什么事? child 写
"line 1\n"
,操作系统将其缓冲在某处并向父级发送信号,该信号上升到最终需要读取的父级;如果在这段时间 child 写
"line 3\n"
同样,操作系统除了缓冲它(使用先前写入的数据)之外别无他法,因此当父级最终读取数据时,无法知道完成了多少(非缓冲)写入来写入它。
关于javascript - 如何从 child_process 中获取无缓冲或至少按顺序获取 stdout 和 stderr,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63791630/
我有以下代码来捕获和处理运行命令输出。 如何修改它以便运行命令窗口显示输出并同时记录输出?更换 @SW_HIDE与 @SW_SHOW (或等效的)只显示一个空白的命令窗口。 类似于linux的东西te
[已编辑] 用于处理 subprocess.Popen 标准输出的 2 个选项是 stdout="a_file_name" 和 stdout=subprocess.PIPE。 stderr 可以通过
c99 的 7.19.3/7 节指出: At program start-up, three text streams are predefined and need not be opened ex
我正在运行以下 proc_open 函数。加载页面时,出现错误: Use of undefined constant STDOUT - assumed 'STDOUT'` 如何正确设置STDOUT和S
我有一个运行多个进程的开发堆栈:网络服务器、自动测试、后台编译等。所有这些都是基本的命令行命令,例如 node app.js 或 lein midje :autotest. 是否可以使用一个脚本在“后
我正在使用 SLURM 在 super 计算机上调度作业。我已设置 --output=log.out 选项,将作业标准输出中的内容放入文件 (log.out)。我发现该文件每 30-60 分钟更新一次
ansible/ansible-playbook 版本:2.1.2.0/2.2.0.0 我正在尝试使用 yum/apt 安装软件包,但由于安装软件包的存储库位于 packagecloud.io 中,有
bala@hp:~$ echo "Hello World" > stdout bala@hp:~$ cat stdout Hello World bala@hp:~$ echo "Hello Worl
在从 Fortran 编写的外部库中调用嘈杂的函数之前,我正在使用如下代码重定向标准输出: // copy standard output out = dup(STDOUT_FILENO); // c
这个问题在这里已经有了答案: How can I pipe stderr, and not stdout? (11 个答案) 关闭 6 年前。 我有一个程序,我想检查其 STDERR 输出并在其上运
我正在从 perl 运行一个 java 应用程序 这是脚本 #!/usr/bin/perl use strict; use warnings; $| = 1; my $args = join (" "
我正在尝试将 python 脚本的 STDOUT 重定向到一个文件。 如果 STDOUT 是从 sys 导入的,脚本的输出不会被重定向到一个文件: from sys import stdout std
我正在尝试使用 PHP 和 Apache(在 Docker 的前台运行)写入 stdout(或 stderr)。 这些作品: file_put_contents( "php://stderr","wo
我正在尝试重定向标准输出,以便 Windows 应用程序中的 printf 将转到我选择的文件。 我这样做: outFile = fopen("log.txt", "w"); *stdout = *o
在 Ruby 中,$stdout(前面有一个美元符号)和 STDOUT(全部大写)有什么区别?在进行输出重定向时,应该使用哪个,为什么? $stderr 和 STDERR 也是如此。 编辑: 刚找到一
让我们看看这个Hello World程序 #include int main(int argc, char ** argv) { printf("Hello, World!"); c
我在 64 位机器上运行 Ubuntu 20.04。 我想将 stdout 重定向到从 memfd_create 获得的描述符。似乎使用 memfd_create 创建的匿名文件只有在 stdout
我想在 Python 脚本末尾捕获控制台输出。也就是说,我既想正常打印到控制台,又想在执行结束时将控制台输出保存到文件中。 我看过各种相关的 SO 问题 1 , 2 , 3尽管他们要么简单地重定向输出
我知道可以将两者都重定向到特定文件: ./command 1> out.log 2> err.log 或 ./command 1>test.log 2>&1 将两者写入文件。但是我不知道在只打印其中一
我知道可以将两者都重定向到特定文件: ./command 1> out.log 2> err.log 或 ./command 1>test.log 2>&1 将两者写入文件。但是我不知道在只打印其中一
我是一名优秀的程序员,十分优秀!