UnixでJavaプロセスが死んでいるかどうかを確認する方法は?

UnixでJavaプロセスが死んでいるかどうかを確認する方法は?

UnixにはJavaアプリケーションがあります。アプリケーションが予期せず停止しました。問題を探しています。

Unixで起動されたJavaプロセスが終了するかどうかはどうすればわかりますか? (でkill -9 pid)コードを変更することも、キャプチャすることもできません。 javaを使用して起動を変更できます-verbose。何かがこのプロセスを殺しています...

$JAVA_HOME/bin/java \
-verbose \
-classpath '../../lib/*:.:./config' com.xxx.xxx.core.xxxxApp instance:$INSTANCE

しかし、ログには表示されません。別の方法がありますか?

答え1

あなたの質問に対するコメントで、ウォルティナーが提案したように、シェルスクリプトを使用してプロセスを実行できます。スクリプトは、プロセスが終了するのを待つのをブロックし、エラーモードの終了ステータスを確認します。

通常、プロセスがシグナルによって終了した場合、プレゼンス状態は 128 にシグナル番号を加えた値です。たとえば、誰かがkill -9プロセスでaを実行すると、終了ステータスは137(128 + 9 = 137)になります。

たとえば、次のスクリプトはコマンドを実行し、信号に応答して終了するとメッセージを出力します。

#!/bin/bash

$JAVA_HOME/bin/java \
    -verbose \
    -classpath '../../lib/*:.:./config' com.xxx.xxx.core.xxxxApp instance:$INSTANCE

rc=$? # The $? variable has the exit status of the previous command


if [[ ${rc} -gt 128 ]]; then
    printf "Process terminated with signal %d\n" $((rc - 128))
fi

これでプロセスをkill -9終了するために使用すると、次のような結果が得られます。java

Process terminated with signal 9

答え2

カーネルがいくつかの問題のためにプロセスを終了するようです。たとえば、プロセスがメモリを使いすぎると、カーネルは終了します。十分な保存(OOM)Killerは問題のあるプロセスを自動的に終了します。ログを調べて、カーネル関連のエラーがあるかどうかを確認できます。

egrep -i 'killed process' /var/log/messages

または

egrep -i -r 'killed process' /var/log

システムログを確認し、実行中のJavaプログラムのプロセスに関連するログを確認することをお勧めします。

dmesg | grep -i kill

たとえば、次に、利用可能なログ全体を確認するためにシャットダウン関連のログを表示します。

dmesg | less

システムログは、メモリの問題であるか他の問題であるかにかかわらず、プロセスが終了した時点の詳細を提供します。

誰かがこのプロセスを終了する場合は、スーパーユーザーが必要です。コマンドを/var/log/auth.log確認できます。kill

関連情報