Nodejs中child_process.spawn生成的子进程如何象jquery的live那样重新注册事件?

Nodejs中child_process.spawn生成的子进程如何象jquery的live那样重新注册事件?

var child_process= require(‘child_process’);
var iconv = require(‘iconv-lite’);

var domain=[‘www.google.com’];

var ping=child_process.spawn(“ping”,domain);

var result=’’; ping.stdout.on(“data”,function(data){

result+= iconv.decode(data, ‘gbk’);

 console.log("ping ..." +domain);

});

ping.on(“close”,function(code){

  console.log(code);
 
  if(result.indexOf("100% 丢失") > 0 ){
      ping=child_process.spawn("ping",domain);
      
  }else {
      
      console.log("google is alive ");
      
  }
 result='';

});

stdout.on('data’只有第一次执行有结果,重新生成的ping如果想要继续输出要怎么写?


2 回复

要实现类似于 jQuery 的 live 方法的效果,即在子进程中重新注册事件,我们可以使用递归函数来不断重新生成子进程。这样可以确保每次子进程结束时,我们都可以重新启动它,从而持续监听事件。

以下是一个示例代码,展示了如何实现这一点:

var child_process = require('child_process');
var iconv = require('iconv-lite');

// 定义要 ping 的域名
var domain = ['www.google.com'];

// 递归函数用于重新生成子进程
function startPing() {
    var ping = child_process.spawn("ping", domain);

    var result = '';

    // 监听子进程的标准输出
    ping.stdout.on("data", function (data) {
        result += iconv.decode(data, 'gbk');
        console.log("ping ... " + domain);
    });

    // 监听子进程的关闭事件
    ping.on("close", function (code) {
        console.log("子进程退出,代码: " + code);

        if (result.indexOf("100% 丢失") > 0) {
            // 如果 ping 失败,则重新启动子进程
            result = '';
            startPing();
        } else {
            console.log("google is alive");
        }
    });
}

// 开始第一个 ping 进程
startPing();

解释

  1. 定义域名

    var domain = ['www.google.com'];
    
  2. 递归函数 startPing

    • 该函数负责生成并管理子进程。
    • 每次子进程关闭后,根据其退出状态决定是否重新启动子进程。
  3. 监听标准输出

    ping.stdout.on("data", function (data) {
        result += iconv.decode(data, 'gbk');
        console.log("ping ... " + domain);
    });
    
    • 将子进程的标准输出数据解码并打印。
  4. 监听子进程关闭事件

    ping.on("close", function (code) {
        console.log("子进程退出,代码: " + code);
    
        if (result.indexOf("100% 丢失") > 0) {
            result = '';
            startPing();
        } else {
            console.log("google is alive");
        }
    });
    
    • 当子进程关闭时,检查退出状态。
    • 如果 ping 失败(例如,出现“100% 丢失”),则重新调用 startPing 函数以重新启动子进程。
    • 如果 ping 成功,则打印相应的信息。

通过这种方式,我们可以实现一个类似 jQuery 的 live 方法的效果,即在子进程结束后自动重新注册事件并重启子进程。


在Node.js中,child_process.spawn生成的子进程并不会自动重新绑定事件。你需要手动重新创建子进程并重新绑定事件。可以通过递归函数或使用事件监听器来实现类似jQuery.live的功能,即当子进程关闭时,重新生成新的子进程。

以下是一个示例代码:

var child_process = require('child_process');
var iconv = require('iconv-lite');

var domain = ['www.google.com'];

function spawnPing() {
    var ping = child_process.spawn("ping", domain);

    ping.stdout.on("data", function (data) {
        var result = iconv.decode(data, 'gbk');
        console.log("ping ..." + domain + ": " + result);
    });

    ping.stderr.on("data", function (data) {
        console.error("stderr: " + data);
    });

    ping.on("close", function (code) {
        console.log("子进程退出,退出码: " + code);
        if (code !== 0) {
            // 重新生成子进程
            spawnPing();
        } else {
            console.log("google is alive");
        }
    });
}

spawnPing();

在这个示例中,spawnPing函数会生成一个ping命令的子进程,并在子进程关闭时再次调用自身以重新生成子进程。这样就可以实现类似jQuery.live的功能,不断监测目标的状态。

如果你希望每次ping的结果都在控制台中打印出来,可以在stdout.on('data')事件处理程序中进行相应的处理。

回到顶部