BashスクリプトでJavaアプリケーションのプロセスIDを検索する(ターゲットアプリケーションがすでに実行されていることを確認)

BashスクリプトでJavaアプリケーションのプロセスIDを検索する(ターゲットアプリケーションがすでに実行されていることを確認)

プロセスIDを取得する方法について多くの質問があることを知っていますが、この質問はユニークに見えます。 Googleが回答を提供していないので、この質問を終了するのではなく、stackexhangeが役に立つことを願っています。

Javaが関連している場合は、プロセスIDを見つけるのが難しいようです(pgrepが機能しません)。

また、bashスクリプトでこれを自動化する必要があります。私が持っている問題の1つは、ps aux | grepプロセス自体をgrepするときに常に発生することです。したがって、単純なbashスクリプトで結果を処理することは、(制限されたbash技術を使用して)良い解決策を自分で理解するのと同じくらい簡単ではありません。

私が試したいくつか:

例1 - 同じ名前のアプリケーションがない場合でもプロセスを返します。

$ ps aux | grep -i anythingnotreal
user2   3040  0.0  0.0   4640   856 pts/3    S+   18:17   0:00 grep --color=auto -i anythingnotreal

例2 - "java_app"が現在実行されていても何も返されません。

$ pgrep java_app

何も返しません。しかし、「java_app」が実行されているという証拠は次のとおりです。

$ ps aux | grep java_app
tester2   2880  0.7  2.8 733196 58444 ?        Sl   18:02   0:07 java -jar /opt/java_app2/my_java_app.jar
tester2   3058  0.0  0.0   4644   844 pts/3    S+   18:19   0:00 grep --color=auto java_app

私にとって必要なのは、興味のあるJavaアプリケーション(私が知っているjarファイル名とパス)が現在実行されているかどうかを知らせるbashスクリプトに接続できるソリューションです。 (実行している場合は、スクリプトが続行する前にユーザーにそれを閉じるように求める必要があります。)

答え1

デフォルトでは、pgrep引数は一致せず、コマンドのみが一致します。コマンドライン全体を一致させるには、この-fオプションが必要です。

$ pgrep -f java_app

pgrepのマンページから:

-fこのパターンは通常プロセス名とのみ一致します。 -fが設定されている場合は、コマンドライン全体を使用してください。

答え2

pidof java実行中のJavaプロセスを見つけて、各プロセスの詳細を取得するために使用できます。たとえば、ps -p $PID -o pid,vsz=MEMORY -o user,group=GROUP -o comm,args=ARGSターゲットアプリケーションが実行されているかどうか、そのアプリケーションを使用するためにユーザーが閉じるか続行するかを確認できます。

答え3

あなたはそれを使用することができますjcmdJDKの一部であるユーティリティです。現在実行中のJavaプロセスのみを一覧表示するので、grepを実行するだけです。java_app

jcmd | grep java_app | cut -d " " -f 1

関連情報