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不起作用


7 回复

当然可以。你希望在 child_processstdout.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}`);
});

解释

  1. 引入依赖

    • iconv-lite 用于将缓冲区数据解码为字符串。
    • child_process 提供了 spawn 方法来创建子进程。
  2. 定义变量

    • MAX 定义了最大输出次数。
    • count 用于记录已经处理的数据块数量。
    • exitCondition 是一个字符串,表示我们希望在什么条件下终止进程。
  3. 监听 stdout 数据

    • 使用 Buffer 将接收到的数据转换为字符串。
    • 使用 iconv.decode 将二进制数据解码为文本。
    • 检查当前数据是否包含 exitCondition 字符串,如果包含则调用 ls.kill() 来终止进程。
    • 如果计数器超过 MAX,也调用 ls.kill() 来终止进程。
  4. 错误处理

    • 监听 stderr 输出,以便捕获任何错误信息。
  5. 进程结束处理

    • 监听 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') 监听标准错误流,如果捕获到任何错误数据,则立即退出进程。

这样可以确保在特定条件满足时,进程能够正常退出。

回到顶部