我可以使用 child_process 来“监听”特定的输出吗?
Can I “listen” for a specific output with child_process?
到目前为止,我已经让我的脚本用 child_process 执行 windows .bat 文件,我的问题是它在后台打开它,无法“连接”到它看看会发生什么并调试,有没有办法“监听”某个输出的发生?例如,如果 .bat 输出“完成!”在 shell 中,有没有办法让我的 node.js 脚本检测到该特定关键字并 运行 进一步命令(如果检测到)?
谢谢!
一些说明:.bat 输出“完成!”并保持 运行ning,它不会停止,我只想检测到“完成!”这样我就可以向用户发送服务器已成功启动的消息
我当前的代码:
exec('D:\servers\game_server_1\start.bat', {shell: true, cwd: 'D:\servers\game_server_1'});
好吧,如果你想做一个一次性的 NodeJS 脚本,你可以只生成一个进程,它用给定的命令启动,并在所有命令完成时退出。这将创建一个您可以监控的一次性流接口。 stdout returns 一个数据缓冲区 returns 你的命令 运行,除非它是类似于 START 之类的东西来启动一个程序——它 returns 为空。您可以在 START 之后发出 KILL
命令 -- your_program.exe
:
const spawn = require('child_process').spawn;
const child = spawn('cmd.exe', ['/c', 'commands.bat']);
let DONE = 0;
const done = () => {
console.log("log it");
DONE++;
};
child.stdout.on('data', function (data) {
console.log('stdout: ' + data);
//it's important to add some type of counter to
//prevent any logic from running twice, since
//this will run twice for any given command
if ( data.toString().includes("DONE") && DONE === 0 ) {
done();
}
});
child.stderr.on('data', function (data) {
console.log('stderr: ' + data);
});
child.on('exit', function (code) {
console.log('child process exited with code ' + code);
});
请记住,当您 运行 命令启动程序并且程序启动时,stdout
事件侦听器中的数据缓冲区将为空。只有在启动程序时出现问题时才会触发错误事件。
你的.BAT:
ECHO starting batch script
//example launching of program
START "" https://localhost:3000
//issue a command after your program launch
ECHO DONE
EXIT
您也可以在启动程序的命令之后立即发出 ECHO DONE
命令并监听它,然后尝试从标准输出中解析出该命令。
你可以使用 Regular expression.
const { spawn } = require('child_process');
const child = spawn(...);
child.stdout.on('data', function (data) {
console.log('stdout: ' + data);
// Now use a regular expression to detect a done event
// For example
data.toString().match(/Done!/);
});
// Error handling etc. here
到目前为止,我已经让我的脚本用 child_process 执行 windows .bat 文件,我的问题是它在后台打开它,无法“连接”到它看看会发生什么并调试,有没有办法“监听”某个输出的发生?例如,如果 .bat 输出“完成!”在 shell 中,有没有办法让我的 node.js 脚本检测到该特定关键字并 运行 进一步命令(如果检测到)?
谢谢!
一些说明:.bat 输出“完成!”并保持 运行ning,它不会停止,我只想检测到“完成!”这样我就可以向用户发送服务器已成功启动的消息
我当前的代码:
exec('D:\servers\game_server_1\start.bat', {shell: true, cwd: 'D:\servers\game_server_1'});
好吧,如果你想做一个一次性的 NodeJS 脚本,你可以只生成一个进程,它用给定的命令启动,并在所有命令完成时退出。这将创建一个您可以监控的一次性流接口。 stdout returns 一个数据缓冲区 returns 你的命令 运行,除非它是类似于 START 之类的东西来启动一个程序——它 returns 为空。您可以在 START 之后发出 KILL
命令 -- your_program.exe
:
const spawn = require('child_process').spawn;
const child = spawn('cmd.exe', ['/c', 'commands.bat']);
let DONE = 0;
const done = () => {
console.log("log it");
DONE++;
};
child.stdout.on('data', function (data) {
console.log('stdout: ' + data);
//it's important to add some type of counter to
//prevent any logic from running twice, since
//this will run twice for any given command
if ( data.toString().includes("DONE") && DONE === 0 ) {
done();
}
});
child.stderr.on('data', function (data) {
console.log('stderr: ' + data);
});
child.on('exit', function (code) {
console.log('child process exited with code ' + code);
});
请记住,当您 运行 命令启动程序并且程序启动时,stdout
事件侦听器中的数据缓冲区将为空。只有在启动程序时出现问题时才会触发错误事件。
你的.BAT:
ECHO starting batch script
//example launching of program
START "" https://localhost:3000
//issue a command after your program launch
ECHO DONE
EXIT
您也可以在启动程序的命令之后立即发出 ECHO DONE
命令并监听它,然后尝试从标准输出中解析出该命令。
你可以使用 Regular expression.
const { spawn } = require('child_process');
const child = spawn(...);
child.stdout.on('data', function (data) {
console.log('stdout: ' + data);
// Now use a regular expression to detect a done event
// For example
data.toString().match(/Done!/);
});
// Error handling etc. here