web-dev-qa-db-ja.com

1つだけを殺すJavaプロセス

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

私もです pkill -9 Javaでも、実行中のIDEは不要です)が強制終了されます。実行中のサーバーにリンクされているアプリケーションのみを強制終了し、他のアプリケーションは強制終了しないようにするにはどうすればよいですか?同じプロセスの下ですが、それらを混乱させる方法がいくつか必要です。

17
Petr Mensik

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

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

ps -A |grep Java

このコマンドの出力により、システムで実行中のJavaプロセスのリストが表示されます。強制終了して実行するプロセスのプロセスID(PID)を書き留めます

kill -9 PID
26
P4cK3tHuNt3R

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

pkill -9 -f <nameOfYourJavaAplication>
11
Marek R

psおよびgrepを使用する代わりに、ps-Cフラグを使用して、「Java」という名前でリストされたすべてのコマンドを選択できます。 ps-fフラグを使用して、リストされている各プロセスの完全なコマンド名を出力することもできます。そうすることで、各Javaプロセスが実際に実行していることを確認できます。ここに、コマンド全体を示します:ps -fC Java

pgrepを使用して、すべてのJavaプロセスをリストすることもできます。pgrep -a Javaは、各JavaのPIDおよび完全なコマンドラインを返します処理する。

強制終了するコマンドのPIDを取得したら、kill-9(SIGKILL)フラグとJavaプロセスのPIDと共に使用します。 kill。Javaは、 'SIGTERM'シグナルを受信して​​も常に停止するとは限りません(プロセスは 'SIGTERM'を処理することが許可されています)。そのため、 'SIGKILL'シグナルを送信すると、initは最初に警告せずにプログラムする必要がある場合がよくあります。

たとえば、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を実行する必要があります。

8
user26112

(特定の)実行中のプログラムを、プログラムのコマンドラインからのパターンを使用して(そして、すべてのJava実行したものだけでなく))スクリプトで見つけて強制終了する場合は、次のようにします。

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

から https://unix.stackexchange.com/a/31111/249209

1
Nikhil VJ

これは、プロセスを自動化するために使用できるスクリプトです。

<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 -efはUnices間で異なる場合があるため、awkは異なるパラメーターを出力する必要がある場合があります。

<PROCESS_NAME>は変数に変更できます。コマンドラインで毎回入力する必要がある場合は、たまに間違える可能性があることを覚えておいてください。正しい名前のスクリプトを複数コピーする方が簡単です。

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

process=`ps -ef | grep -v awk | awk -e '/Java.*'"${PROCESS_NAME}"'/ { print $2 }'`
0
Alexis Wilke

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

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

0