Как вызвать программу Java из NodeJs

У меня есть программа Java, которую я обычно запускаю из командной строки. После запуска из командной строки программа java продолжает работать вечно до тех пор, пока Ctrl + C не будет нажата, чтобы выйти из нее или убить команду из другого script. Программа Java выводит сообщения об ошибках, если они есть на консоли.

Теперь я хочу создать веб-приложение с поддержкой NodeJs. Когда пользователь нажимает на ссылку (Run), обработчик клика будет вызывать запрос Ajax, который заставит backend NodeJs script запустить эту программу Java, если она еще не запущена. Другая ссылка (Stop) заставит Ajax-запрос остановить эту программу Java.

Как это можно достичь? Ответ на пример кода будет наиболее полезным.

Также существует требование: если это веб-приложение NodeJs прекращено, запущенная им программа Java продолжает работать, то есть она не зависит от веб-приложения NodeJs.

Ответ 1

Вы можете запустить дочерний процесс и отправить сигнал уничтожения, когда он вам не нужен.

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

Чтобы убить приложение или имитировать a 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();

Это порождает дочерний процесс, потоки ввода-вывода которого не связаны с родительским процессом.