Nodejs:child_process在执行命令后,stdout.on("data") 怎么样在遇到指定字符串或者条件时退出?
Nodejs:child_process在执行命令后,stdout.on(“data”) 怎么样在遇到指定字符串或者条件时退出?
var iconv = require(‘iconv-lite’); var ls= require(‘child_process’).spawn(‘ping’, [‘www.baidu.com’]);
var MAX=2; var count=1;
ls.stdout.on(‘data’, function (data) { var buffer = new Buffer(data); var str = iconv.decode(buffer, ‘gbk’); console.log(count+’ stdout: ’ + str); count++
if( count > MAX ){
return;
}
});
这个return不起作用
当然可以。你希望在 child_process
的 stdout.on('data')
事件中,在检测到特定的字符串或满足某个条件时退出。我们可以通过添加一个条件检查来实现这一点。下面是一个修改后的示例代码,其中包含了如何在检测到特定字符串时退出的方法。
示例代码
var iconv = require('iconv-lite');
var spawn = require('child_process').spawn;
var ls = spawn('ping', ['www.baidu.com']);
var MAX = 2;
var count = 1;
var exitCondition = 'Request timed out'; // 指定退出条件
ls.stdout.on('data', function (data) {
var buffer = new Buffer(data);
var str = iconv.decode(buffer, 'gbk');
console.log(count + ' stdout: ' + str);
if (str.includes(exitCondition)) {
console.log(`Exit condition met: ${exitCondition}`);
ls.kill(); // 终止进程
}
count++;
if (count > MAX) {
console.log(`Reached maximum count: ${MAX}`);
ls.kill(); // 终止进程
}
});
ls.stderr.on('data', function (data) {
console.error('stderr: ' + data.toString());
});
ls.on('close', function (code) {
console.log(`Child process exited with code ${code}`);
});
解释
-
引入依赖:
iconv-lite
用于将缓冲区数据解码为字符串。child_process
提供了spawn
方法来创建子进程。
-
定义变量:
MAX
定义了最大输出次数。count
用于记录已经处理的数据块数量。exitCondition
是一个字符串,表示我们希望在什么条件下终止进程。
-
监听
stdout
数据:- 使用
Buffer
将接收到的数据转换为字符串。 - 使用
iconv.decode
将二进制数据解码为文本。 - 检查当前数据是否包含
exitCondition
字符串,如果包含则调用ls.kill()
来终止进程。 - 如果计数器超过
MAX
,也调用ls.kill()
来终止进程。
- 使用
-
错误处理:
- 监听
stderr
输出,以便捕获任何错误信息。
- 监听
-
进程结束处理:
- 监听
close
事件,当进程结束时打印退出代码。
- 监听
通过这种方式,你可以根据需要在特定条件满足时退出进程。
data事件每次触发都会调用回调函数,你加个return没有意义吧。
on(“xx” 的回调函数里面就没办法break吗?
说明return在回调函数也是起作用的,我还以为回调函数有什么特殊的呢
if (condiction) {
ls.kill('SIGINT'); // or ls.kill(0)
}
在遇到某一个情况的时候这样把子进程干掉就可以了。具体你想用什么方式来结束进程基本上都是 kill 方法里面传数字或者字符串的信号给子进程。如果你要分行的话用 pipe
多好:
var es = require('event-stream');
//....blabla
ls.stdout
.pipe(es.split('\n'))
.pipe(es.through(function(line) {
if (condition) {
ls.kill()
this.queue(null)
}
// do other stuffs....
// or pipe output to other dest stream
}))
pipe 是管道,就是一边输出一边处理,不是全部输出完了,再处理,这就是你说的分行吧
你可以通过在 stdout.on('data')
的回调函数中检查特定字符串或满足某个条件来退出进程。你可以使用 process.exit()
来退出当前的 Node.js 进程。
以下是一个示例代码:
var iconv = require('iconv-lite');
var spawn = require('child_process').spawn;
var ls = spawn('ping', ['www.baidu.com']);
var MAX = 2;
var count = 1;
ls.stdout.on('data', function (data) {
var buffer = new Buffer(data);
var str = iconv.decode(buffer, 'gbk');
console.log(count + ' stdout: ' + str);
count++;
if (str.includes('Destination host unreachable')) { // 检查特定字符串
console.log('Exiting due to destination host unreachable.');
process.exit(0); // 退出进程
}
if (count > MAX) {
console.log('Exiting after reaching max count.');
process.exit(0); // 退出进程
}
});
ls.stderr.on('data', function (data) {
console.error('stderr: ' + data);
process.exit(1); // 退出进程
});
ls.on('close', function (code) {
console.log('Child process exited with code ' + code);
});
解释:
iconv-lite
用于将二进制数据解码为字符串。spawn
方法启动一个新的子进程。stdout.on('data', callback)
监听子进程的标准输出,并在每次接收到数据时调用回调函数。process.exit(code)
用于终止当前的 Node.js 进程。你可以传递一个状态码(通常是0表示成功,非0表示失败)。- 在上面的例子中,如果检测到特定的字符串
Destination host unreachable
或者计数超过最大值MAX
,则会调用process.exit(0)
来退出进程。 - 同样地,
stderr.on('data')
监听标准错误流,如果捕获到任何错误数据,则立即退出进程。
这样可以确保在特定条件满足时,进程能够正常退出。