プロセス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