私の友人はインタビューで次の質問をしました:
一度に実行されているアプリケーション(tomcatなど)のインスタンスが1つだけであることをどのように確認しますか?
アプリケーションの別のインスタンスが開始されると、1つのインスタンスがすでに実行されていることを示すエラーメッセージが表示されます。
アプリケーションが異常終了した場合、アプリケーションを起動できるはずです。
上記の質問に対する私の答えは、ポートに関するものです。上記の質問を「より深く」理解している人はいますか?
私の友人はインタビューで次の質問をしました:
一度に実行されているアプリケーション(tomcatなど)のインスタンスが1つだけであることをどのように確認しますか?
アプリケーションの別のインスタンスが開始されると、1つのインスタンスがすでに実行されていることを示すエラーメッセージが表示されます。
アプリケーションが異常終了した場合、アプリケーションを起動できるはずです。
上記の質問に対する私の答えは、ポートに関するものです。上記の質問を「より深く」理解している人はいますか?
「PIDファイル」の使用をお勧めします。
たとえば、アプリケーションの起動時にPIDファイルを作成できます(たとえば、の下/var/run/mypgm.pid
)。そのpidファイルに、アプリケーションのPID(プロセスID)を保存します。アプリケーションをシャットダウン(クリーン)すると、そのPIDファイルが削除されます。
これで、アプリケーションを2回起動するときに、そのPIDファイルが存在するかどうかを確認します。ファイルが存在する場合、2つのオプションがあります。
これで、そのPIDファイルを解析して、そのPIDで実行されているプロセスがまだあるかどうかを確認できます。その場合は、エラーメッセージを表示します。そうでない場合は、PIDファイルを削除してアプリケーションを起動するだけです。
java.nio.channels.FileLockは、3 つのポイント (異常終了のケースを含む) をすべて一致させるのに役立ちます。
例はこちらです。
アプリケーションがすでに実行されているシナリオを確認する可能性はいくつかありますが、他にもたくさんあると確信しています。
インスタンスがすでに実行されている場合にメッセージを表示することは、インスタンスが実行中であることを検出すると簡単です (メッセージを表示して終了するだけです)。
編集: アプリケーションがクラッシュした後に別のプロセスが同じ PID を受け取った場合、PID ファイルを使用する @ortang は依然として問題を引き起こす可能性があります。この場合、ファイルを手動で削除しない限り、アプリケーションを起動できません。