0

私の友人はインタビューで次の質問をしました:

  1. 一度に実行されているアプリケーション(tomcatなど)のインスタンスが1つだけであることをどのように確認しますか?

  2. アプリケーションの別のインスタンスが開始されると、1つのインスタンスがすでに実行されていることを示すエラーメッセージが表示されます。

  3. アプリケーションが異常終了した場合、アプリケーションを起動できるはずです。

上記の質問に対する私の答えは、ポートに関するものです。上記の質問を「より深く」理解している人はいますか?

4

3 に答える 3

12

「PIDファイル」の使用をお勧めします。

たとえば、アプリケーションの起動時にPIDファイルを作成できます(たとえば、の下/var/run/mypgm.pid)。そのpidファイルに、アプリケーションのPID(プロセスID)を保存します。アプリケーションをシャットダウン(クリーン)すると、そのPIDファイルが削除されます。

これで、アプリケーションを2回起動するときに、そのPIDファイルが存在するかどうかを確認します。ファイルが存在する場合、2つのオプションがあります。

  • アプリケーションはまだ実行中です
  • アプリケーションがクラッシュし、pidファイルはまだそこにあります。

これで、そのPIDファイルを解析して、そのPIDで実行されているプロセスがまだあるかどうかを確認できます。その場合は、エラーメッセージを表示します。そうでない場合は、PIDファイルを削除してアプリケーションを起動するだけです。

于 2012-04-16T09:18:51.513 に答える
1

java.nio.channels.FileLockは、3 つのポイント (異常終了のケースを含む) をすべて一致させるのに役立ちます。

例はこちらです。

于 2012-04-16T09:53:54.440 に答える
0

アプリケーションがすでに実行されているシナリオを確認する可能性はいくつかありますが、他にもたくさんあると確信しています。

  1. 同じ名前の他のプロセスがすでに実行されていないことを確認します (同じ名前のアプリケーションが存在する場合は問題になりますが、可能性は低いです)
  2. ファイルをロックとして使用します (ただし、クラッシュすると問題が発生する可能性があります)

インスタンスがすでに実行されている場合にメッセージを表示することは、インスタンスが実行中であることを検出すると簡単です (メッセージを表示して終了するだけです)。

編集: アプリケーションがクラッシュした後に別のプロセスが同じ PID を受け取った場合、PID ファイルを使用する @ortang は依然として問題を引き起こす可能性があります。この場合、ファイルを手動で削除しない限り、アプリケーションを起動できません。

于 2012-04-16T09:14:51.667 に答える