web-dev-qa-db-ja.com

SpringBootアプリケーションのプロセスIDを取得する方法

Spring Bootは、起動時にプロセスIDをログに出力していることに気づきました。ここで、このpidを使用してこのプロセスを強制終了し、アプリケーションを再起動するスクリプトを作成します。 Spring Bootはこのpidを取得するためのAPIを提供しますか?ありがとう!

8
walsh

SpringBootはクラスApplicationPidFileWriterを提供し、それがPIDをファイルに書き込みます。 SpringApplicationにリスナーとして追加することでアクティブ化できます。

SpringApplication springApplication = new SpringApplication(DemoApplication.class);
springApplication.addListeners(new ApplicationPidFileWriter());
springApplication.run(args);

ApplicationPidFileWriterのコンストラクターは、文字列またはカスタムファイル名のFileオブジェクトを取ることもできます。次に、そのファイルからPIDを読み取り、スクリプトで使用できます。

16
dunni

私は以下を試しました:-

SpringApplication application=new SpringApplication(StartofdayApplication.class);
application.addListeners(new ApplicationPidFileWriter(new File("C:\\temp\\StartofdayApplication.pid")));
application.run(args);

しかし、ApplicationPidFileWriterが非推奨になり、私の春のバージョンは1.4.7であるため、警告が表示されます。これを実現する別の方法はありますか。

0
user3797766

パートV. Spring Boot Actuatorから:本番環境に対応した機能のドキュメント

Spring-bootモジュールには、プロセスの監視に役立つことが多いファイルを作成するための2つのクラスがあります。

  • ApplicationPidFileWriterは、アプリケーションPIDを含むファイルを作成します(デフォルトでは、アプリケーションディレクトリにapplication.pidというファイル名で)。
  • WebServerPortFileWriterは、実行中のWebサーバーのポートを含む1つまたは複数のファイルを作成します(デフォルトでは、アプリケーションディレクトリにapplication.portというファイル名で)。

デフォルトでは、これらのライターはアクティブ化されていませんが、以下を有効にすることができます。

  • 構成を拡張することによって
  • セクション60.2「プログラム的に」

これが60.1拡張構成の部分です:

次の例に示すように、META-INF/spring.factoriesファイルで、PIDファイルを書き込むリスナーをアクティブ化できます。

org.springframework.context.ApplicationListener=\
org.springframework.boot.context.ApplicationPidFileWriter,\
org.springframework.boot.web.context.WebServerPortFileWriter

これにより、起動時にpidとポートの両方の出力が可能になります。

したがって、アイデアはかなり単純です。SpringBootアプリケーションのsrc/main/resources/META-INFフォルダーに、存在しない場合は、前のコンテンツを含むspring.factoriesファイルを作成して、両方(pidまたはport)を有効にするか、次のようにします。 PID出力のみを有効にします。

org.springframework.context.ApplicationListener=org.springframework.boot.context.ApplicationPidFileWriter
0
davidxxx

ApplicationPidFileWriterを使用する必要はなく、ApplicationPidを使用するだけです。

SpringApplication springApplication = new SpringApplication(MyApplication.class);
springApplication.run(args);
log.info(new ApplicationPid().toString());
0
chunzhenzyd

Tasklistコマンドを実行して、アクティブなプロセスを一覧表示すると、その識別子(PID)が表示されます。

スクリプトでそれらをファイルに書き込むこともできます。

tasklist /v txt > filename.txt

その後、スクリプトを使用してファイルを読み取り、pidを取得できます。

最終的には、スクリプトを使用してプロセスを強制終了します。

0
Amr Arafat