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