15

我有一个通常从命令行启动的 Java 程序。从命令行启动后,java 程序会一直运行,直到按下 Ctrl+C 退出它或从另一个脚本中终止命令。如果有错误消息,Java 程序会向控制台输出错误消息。

现在我想开发基于 Express 的 NodeJs Web 应用程序。当用户单击链接 (Run) 时,单击处理程序将调用 Ajax 请求,这将导致后端 NodeJs 脚本运行此 Java 程序(如果它尚未运行)。另一个链接 (Stop) 将发出 Ajax 请求以停止该 Java 程序。

如何做到这一点?用示例代码回答将是最有用的。

还有一个要求:如果这个 NodeJs Web 应用程序被终止,由它启动的 Java 程序继续运行,即它不依赖于 NodeJs Web 应用程序。

4

3 回答 3

14

您可以启动子进程,并在不需要时发送终止信号。

var spawn = require('child_process').spawn;
var child = spawn('java', ['params1', 'param2']);

要终止应用程序或模拟CTRL+ C,请发送信号:

// control + c is an interrupt signal
child.kill('SIGINT');

// or send from the main process
process.kill(child.pid, 'SIGINT');

如果您要分离运行应用程序,您可能应该在某处写入 PID。要分离运行应用程序,请像这样运行它:

var fs = require('fs');
var out = fs.openSync('./out.log', 'a');
var err = fs.openSync('./out.log', 'a');

var child = spawn('java', [], {
  detached: true,
  stdio: [ 'ignore', out, err ]
});
child.unref();

这会产生一个子进程,其 I/O 流与父进程无关。

于 2013-09-15T18:20:04.390 回答
2

您可以使用模块node-java-caller简单地调用带有类路径和参数的 java 命令

于 2020-08-10T07:35:14.623 回答
0

即使父进程退出,通常产生的子进程也不会结束。要杀死子进程,需要将子进程 pid 记录在某个地方(在文件中以允许该值即使在父进程退出时也存在),并且可以在需要时使用相同的值来杀死子进程。

于 2019-12-03T21:40:49.797 回答