1

ユーザーがリモートでサーバー上で AI アルゴリズムを実行できるようにするアプリケーションを開発しています。これらのアルゴリズムの中には、非常に長い時間がかかるものがあります。AJAX 呼び出しがアルゴリズム パラメータを提供し、サーバー上で C++ アルゴリズムを起動するように設定されています。計算の結果とステータスは、AJAX 呼び出しのポーリング ステータス ファイルを介して追跡されます。このソリューションは、サービスを同時に使用する複数のユーザーに対してうまく機能するようですが、現在、ユーザーのブラウザーから計算をキャンセルする方法を探しています。AJAX 更新サービスを停止し、ブラウザとサーバー上で実行中のプロセスとの間の通信を停止する停止ボタンがあります。問題は、プロセスがまだ実行されていることです。ユーザーが操作をキャンセルしたときにサーバー リソースを解放したいと考えています。以下に詳細を示します。

AJAX呼び出しがヒットした Web サービスはユーザーの下で実行'tomcat'され、ps -U tomcat で一覧表示できます。アルゴリズムの実行はすべて「java」の子プロセスであり、ps --ppid ###.

ブラウザは、現在の計算が開始された時刻の記録を保持します (サーバー システム時間ではなく、ユーザー システム時間)。

異なる場所から接続されたユーザーから複数の計算が同時に行われる可能性があり、その結果、同じ名前と親プロセスの下に多くのプロセスが作成されます。

restful サービスは、 java 経由で端末コマンドを実行しますruntime.exec()

私はシェルスクリプトについてあまり詳しくないので、助けていただければ幸いです。Javaプロセスオブジェクトまたはシェルスクリプト/ awkを使用してtimestamp(おそらくユーザーシステム時間に最も近いタイムスタンプ..?)または他の方法でプロセスを見つける方法を考えられる人はいますか?

前もって感謝します。

- 編集

pid がある場合、Java で特定のプロセスのハンドルを取得する方法さえありますか? そのようには見えません。

- 編集

サーバー上で長時間実行されているプロセスのソース コードを変更できません。:(

4

3 に答える 3

2

AJAX 呼び出しは、プロセスへのセマフォとして機能するある種のリソース (最も便利なテキスト ファイル) を操作する必要があります。これは、ポーリングの反復ごとに、そのセマフォ ファイルが停止状態に設定されているかどうかを確認します。AJAX がセマフォ ファイルを停止するように変更すると、アプリケーションがそれをチェックしてそれに応じて応答するため、プロセスは停止します。つまり、PID が何であるかを把握してから OS レベルでそれを強制終了するのではなく、その機能を Java AI アプリケーションにプログラムする必要があるということです。もちろん、これはアプリのソース コードにアクセスできることを前提としています。

もちろん、セマフォはファイルである必要はありませんが、好みや構成に合わせて DB などの値にすることができます。

于 2013-01-15T19:47:58.247 に答える
1

私はついに安全な解決策を見つけました。安らかなJavaサービスから、を使用Process p = Runtime.getRuntime().exec()すると、実行中のプロセスのハンドルが得られます。ただし、pid を取得する唯一の方法は、リフレクションと呼ばれる手法を使用することです。

Field f = p.getClass().getDeclaredField();
f.setAccessible(true);
String pid = Integer.toString(f.getInt(p));

信じられないくらいむずかしい…

とにかく、サーバーからクライアントに p を渡すことは不可能であり、リモート呼び出しがパラメーターで渡された pid によって任意のサーバープロセスを強制終了できるという不安があるため、私が思いついた唯一の論理的な戦略は次のように書くことでした取得した pid を、最初のクライアント タイムスタンプによって示されるプロセス固有のファイルに保存し、安らかなサービス関数が戻ったときにこのファイルを削除します。この一意のファイルは、ファイルを読み取り、ファイルの内容と等しい pid でプロセスを終了するさらに別の安らかなサービスを介して終了ハンドルとして使用できます。これ

于 2013-01-16T19:33:37.727 に答える
0

Processによって返されたインスタンスを保持し、runtime.execProcess.destroy を呼び出してサブプロセスを強制終了できます。あなたの Web サービス アプリケーションについてよく知らないので、ユーザーをプロセス リストにマップするグローバル セッション マップにプロセス インスタンスを保持できると思います。このマップへのアクセスがスレッドセーフであることを確認してください。また、このようなグローバル セッション マップを異なるリクエスト間で共有できる 1 つの Web サービス プロセスがある場合にのみ機能します。

または、Get subprocess id in Java をご覧ください。

于 2013-01-15T20:21:04.633 に答える