유닉스에서 자바 프로세스가 죽었는지 확인하는 방법은 무엇입니까?

유닉스에서 자바 프로세스가 죽었는지 확인하는 방법은 무엇입니까?

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

귀하의 질문에 대한 의견에서 waltinator가 제안했듯이 쉘 스크립트를 사용하여 프로세스를 실행할 수 있습니다. 스크립트는 프로세스가 종료되기를 기다리는 것을 차단한 다음 오류 모드에 대한 종료 상태를 확인합니다.

일반적으로 프로세스가 시그널에 의해 종료되면 존재 상태는 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

시스템 로그를 확인하고, 실행 중인 자바 프로그램의 프로세스와 관련된 로그를 살펴보는 것이 좋습니다.

dmesg | grep -i kill

예를 들어 다음은 사용할 수 있는 전체 로그를 확인하기 위해 종료 관련 로그를 표시합니다.

dmesg | less

시스템 로그는 메모리 문제인지 아니면 다른 문제인지에 관계없이 프로세스가 종료된 시점에 대한 세부 정보를 제공합니다.

누군가 이 프로세스를 종료하는 경우 슈퍼유저가 필요합니다. 명령을 /var/log/auth.log확인할 수 있습니다.kill

관련 정보