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如果想要继续输出要怎么写?
要实现类似于 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();
解释
-
定义域名:
var domain = ['www.google.com']; -
递归函数
startPing:- 该函数负责生成并管理子进程。
- 每次子进程关闭后,根据其退出状态决定是否重新启动子进程。
-
监听标准输出:
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) { 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')事件处理程序中进行相应的处理。

