15

通常はコマンドラインから起動するJavaプログラムがあります。コマンドラインから開始した後、Java プログラムは、Ctrl+C を押して終了するか、別のスクリプトからのコマンドを強制終了するまで、永久に実行され続けます。Java プログラムは、エラー メッセージがあればコンソールに出力します。

今、高速ベースの NodeJs Web アプリケーションを開発したいと考えています。ユーザーがリンク (実行) をクリックすると、クリック ハンドラーは Ajax 要求を呼び出します。これにより、バックエンドの NodeJs スクリプトがこの Java プログラムをまだ実行していない場合に実行されます。別のリンク (停止) は、この Java プログラムを停止する Ajax 要求を行います。

これはどのように達成できますか?サンプルコード付きの回答が最も役に立ちます。

また、要件があります。この NodeJs Web アプリケーションが終了した場合、それによって開始された Java プログラムは実行を継続します。つまり、NodeJs Web アプリケーションに依存しません。

4

3 に答える 3

14

子プロセスを開始し、必要のないときに kill シグナルを送信できます。

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 に答える