我可以使用 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