1つのJavaプロセスのみを強制終了する


16

私は通常、いくつかのJavaアプリケーションを実行します。1つはローカルで実行されるサーバー用で、もう1つはNetBeansなどのIDE用です。そして、何度も再デプロイした後、サーバーがOutOfMemoryExceptionでスタックするため、再起動するにはJavaプロセスを強制終了する必要があります。

だから私はやるpkill -9 javaが、これはまた実行したくないIDEを殺す。他のサーバーではなく、実行中のサーバーにリンクされているアプリケーションのみを強制終了するにはどうすればよいですか?


2
topまたはを介してps)プロセステーブルを見て、正しいテーブルを選択し、PIDで強制終了します(kill -9 PID_number)。
急ぎます

そうそう、今ではそれを見ることができます。だから私はちょうど右でプロセスを殺す必要がありPIDます。
どうも

これを自動化する必要があります。特定のプログラムのPIDを取得する方法は?
ニヒルVJ

回答:


22

複数のプロセスに関連付けられているプロセスを強制終了するには、そのプロセスに関連付けられているプロセスIDを使用して強制終了する必要があります。

そのJavaプロセスのプロセスIDを取得するには

ps -A |grep java

このコマンドの出力は、システムで実行されているJavaプロセスのリストを提供します。強制終了して実行するプロセスのプロセスID(PID)を書き留めます。

kill -9 PID

あなたは一つのコマンドによって、すべてのJavaプロセスを強制終了する場合ps ax | grep java | grep -v 'grep' | cut -d '?' -f1 | xargs kill -9
Andrii Karaivanskyi

11

IMOの最適なソリューションは次のとおりです。

pkill -9 -f <nameOfYourJavaAplication>

パーフェクト。私は ps -fC javanameOfYourJavaAplication-Dprogram.name
かつて

8

psおよびを使用する代わりに、's フラグをgrep使用して、' java 'という名前でリストされているすべてのコマンドを選択できます。また、リストされた各プロセスの完全なコマンド名を出力するためにのフラグを使用することもできます。これにより、各Javaプロセスが実際に何をしているかを確認できます。完全なコマンドは次のとおりです。ps-Cps-fps -fC java

また、pgrepすべてのJavaプロセスをリストするのにも使用できます。pgrep -a java各JavaプロセスのPIDと完全なコマンドラインを返します。

終了するコマンドのPIDを取得したらkill-9(SIGKILL)フラグと終了するJavaプロセスのPIDを使用します。Javaは「SIGTERM」シグナルを受信したときに常に停止するとは限らないため(プロセスは「SIGTERM」の処理を許可されます)、「SIGKILL」シグナルを送信する必要があります。

たとえば、ps -fC javaリターン

UID        PID  PPID  C STIME TTY          TIME CMD
jeff      9014  8890  0 08:51 pts/0    00:00:00 java IDE
jeff     11775  8890  6 08:59 pts/0    00:00:00 java TestProgram

またはpsgrep -a java返す

9014 java IDE
11775 java TestProgram

そしてあなたが殺したいjava TestProgramなら、あなたは走るべきkill -9 11775です。


1

プログラムのコマンドラインのパターンを使用して(実行中のすべてのJavaのことだけでなく)(特定の)実行中のプログラムを見つけて強制終了するスクリプトが必要な場合:

pgrep -f pattern # shows the PID
pkill -f pattern

/unix//a/31111/249209から


「スキル」、13年2月13日
ジェフシャラー

0

jpsまた、jcmdJavaプロセス情報とPIDのみを表示することに特化したツールです。

より詳細な出力を得るには、オプションを調べることができます。


それらは自分のコンピューター上でのみリストされます。
アレクシスウィルク

次に、他のJavaプロセスが実行されていることを確認しますか?!
ムハンマドゲルバナ

はい。コマンドをテストするときに、CassandraまたはElassadraを実行しました。
アレクシスウィルク

0

プロセスを自動化するために使用できるスクリプトを次に示します。

<PROCESS_NAME>パーツをjavaが実行しているものに置き換えます。

#!/bin/sh
process=`ps -ef | grep -v awk | awk -e '/java.*<PROCESS_NAME>/ { print $2 }'`
kill ${process}

注:を入れませんでした-9。信号をキャプチャし、SIGTERM(デフォルト)が失敗しない限り、私は必要ありません。また、読みやすいように信号名を使用することをお勧めします。

kill -TERM ${process}

警告

実行する前にkill ...$process変数が期待どおりに設定されていることを確認してください。ps -efUnix間の5月異なるのでawk異なるパラメータを印刷する必要があるかもしれません。

注意

<PROCESS_NAME>変数に変えることができます。コマンドラインで毎回入力しなければならない場合、時々間違いを犯す可能性が高いことを覚えておいてください。正しい名前のスクリプトを複数コピーする方が簡単だと思います。

また、awkスクリプトの単一引用符に注意してください。つまり、変数を挟んで文字列を閉じて再度開く必要があります。このような何かが動作するはずです(テストされていません):

process=`ps -ef | grep -v awk | awk -e '/java.*'"${PROCESS_NAME}"'/ { print $2 }'`
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.