1

さて、Linuxサーバーでcronジョブを使用して実行しているJavaプログラムがいくつかあります。これらのジョブは約10分ごとに実行され、実行には文字通り2分かかり、その後終了します。プログラムが起動したときに、実行中のインスタンスがすでに存在するかどうかをプログラムが検出する方法を追加する必要があります。存在する場合は、それ以上先に進まずに終了します。私はこれを処理するための最良の方法が本当にわかりませんが、誰かがいくつかのアドバイスを提供できることを望んでいます。

私が検討したアプローチの1つは、ある種のPSコマンドを実行するJavaコードからコマンドライン引数を実行し、それらを調べて実行されているかどうかを確認することです。これは非常に小さいものではありますが、かなり厄介で複雑に見えます。さらに、私はLinuxに精通しているわけではなく、そのための最善の方法もわかりません。誰かがもっと良い考えを持っているなら、私に知らせてください。または、それが最善の方法である場合、必要なLinuxコマンドを提供できれば幸いです。ありがとう。

4

3 に答える 3

2

書き込み可能な /tmp ディレクトリがある場合は、ロックファイルを使用できます。

Java プログラムが起動したら、アプリケーションに固有の名前のファイル (「my-lock-file.lock」など) が /tmp ディレクトリにあるかどうかを確認します。存在しない場合は作成し、完了したら削除します。存在する場合は、そのまま終了します。

ファイルの存在は、java.io.File クラスの .exists() メソッドで確認できます。

コードを移植可能にする必要がある場合は、 を使用System.getProperty("java.io.tmpdir"));して、コードが実行されているプラ​​ットフォームに適した一時ディレクトリを取得できます。

于 2012-07-25T15:14:46.033 に答える
0

多くのプログラムは、PIDを指す一時ファイル(「ロック」ファイルと呼ばれることが多い)を作成することでこれを解決します。ファイル名は、このプロセスを合法的に並行して実行できる他のプロセスと区別するために、すべての関連情報をエンコードする必要があります。

たとえば、プロセスがユーザーにバインドされている場合は、ユーザー名が含まれている必要があります。プロセスがマシンにバインドされている場合は、ホスト名も含まれている必要があります(マシンにバインドされた一時ディレクトリに配置する場合、これは議論の余地があります。ホームディレクトリに配置する場合は、複数のマシンの場合を考えてみてください。 NFSを介してホームを共有する)。

これらのファイルの場所は通常/tmpです。/ tmpは通常、システムの起動中にワイプされるため、これは最適な場所です。システムがクラッシュした場合に孤立したファイルが残ることはありません。一部のプログラムで採用されている別の解決策は、設定に関連している場合は、ロックファイルをユーザー設定ディレクトリに配置することです。たとえば、mozillathunderbirdには。というファイルがあります/home/<username>/.thunderbird/<profilename>.default/lock

ファイルには、プロセスのPIDが含まれている必要があります。考え方は単純です。ファイルにPIDが含まれている場合、このプロセスが実際に実行されているかどうかを簡単に確認できます。したがって、プロセスがクラッシュすると、ファイルは孤立します。新しいプロセスインスタンスは、ファイル内のPIDをチェックし、それがもう実行されていないことを確認し、ファイルを無視します(上書き)。

すべてをまとめると、次のようなファイルを作成できます。

/tmp/myawesomeservice-username-hostname-lock

内容:

12345
于 2012-07-25T15:16:39.953 に答える
0

JMX と Attach API を調べて、実行中の JVM を照会できます。

または、Andrew logvinov が述べたように、ロック ファイルを使用します。

Java WebStart を使用している場合、これは既にネイティブでサポートされています。

于 2012-07-25T15:14:45.877 に答える