私は通常、いくつかのJavaアプリケーションを実行します。1つはローカルで実行しているサーバー用で、もう1つはIDE NetBeansのように実行します。そして、時々、多くの再デプロイメントの後、サーバーがOutOfMemoryExceptionでスタックするので、再起動するためにJavaプロセスを終了する必要があります。
私もです pkill -9 Java
でも、実行中のIDEは不要です)が強制終了されます。実行中のサーバーにリンクされているアプリケーションのみを強制終了し、他のアプリケーションは強制終了しないようにするにはどうすればよいですか?同じプロセスの下ですが、それらを混乱させる方法がいくつか必要です。
複数のプロセスに関連付けられているプロセスを強制終了するには、そのプロセスに関連付けられているプロセスIDを使用して強制終了する必要があります。
そのJavaプロセス実行のプロセスIDを取得するには
ps -A |grep Java
このコマンドの出力により、システムで実行中のJavaプロセスのリストが表示されます。強制終了して実行するプロセスのプロセスID(PID)を書き留めます
kill -9 PID
IMOの最適なソリューションは次のとおりです。
pkill -9 -f <nameOfYourJavaAplication>
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
を実行する必要があります。
(特定の)実行中のプログラムを、プログラムのコマンドラインからのパターンを使用して(そして、すべてのJava実行したものだけでなく))スクリプトで見つけて強制終了する場合は、次のようにします。
pgrep -f pattern # shows the PID
pkill -f pattern
これは、プロセスを自動化するために使用できるスクリプトです。
<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 }'`
jps
とjcmd
は、Javaプロセス情報とPIDのみを表示することに特化したツールです。
これらのオプションを調べて、より詳細な出力を得ることができます。