때때로 CPU의 100%를 차지하고 온도를 약 30C까지 높이는 불량 Java 프로세스가 있습니다(보통 종료되지 않으면 충돌이 발생함).
문제는 너무 빨리 종료해야 하기 때문에 실제로 그것을 식별하거나(매개변수 및 항목의 긴 목록이 있음) 분석할 수 없다는 것입니다.
과거에 종료한 프로세스의 ID를 확인하기 위해 볼 수 있는 일종의 로그가 있습니까? 그렇지 않은 경우 다음에 프로세스가 발생할 때 프로세스를 캡처할 수 있는 방법이 있습니까?
중요한 경우 OpenSuse 11.4를 사용하고 있습니다.
답변1
아니요, 기본적으로는 아닙니다. 로깅이 너무 많습니다(특히 로그 항목을 작성하는 로깅 작업을 시작하는 경우...).
BSD 프로세스 회계(사용 가능한 경우 실행 lastcomm
), 활성화된 경우 실행된 각 명령의 이름과 일부 기본 통계를 기록하지만 인수는 기록하지 않습니다.
이것감사 하위 시스템더욱 다양하고 유연해졌습니다. audit
패키지를 설치 하고 읽으십시오SuSE 감사 가이드(주로 대략규칙) 또는 시도해 보세요.
auditctl -A exit,always -F path=/usr/bin/java -S execve
또는: 죽이는 대신 kill -STOP
죽여라. 이것멈추다질문 없이 프로세스를 일시 중지합니다. 나중에 재개( kill -CONT
)하거나 종료( ) 할 수 있습니다 . kill -KILL
프로세스가 여전히 존재하는 한 해당 명령줄( /proc/12345/cmdline
), 메모리 맵( /proc/12345/maps
) 등을 검사할 수 있습니다.
또는 프로세스에 디버거를 연결하고 일시 중지합니다. 이는 매우 간단합니다 gdb --pid 12345
(Java 프로세스에는 더 나은 옵션이 있을 수 있음). 디버거를 연결하면 프로세스가 즉시 일시 중지됩니다(디버거를 종료하면 프로세스가 SIGCONT를 수신하고 다시 시작합니다).
이 모든 것은 JVM 스레드가 아닌 운영 체제 수준 프로세스만 캡처합니다. 스레드를 디버그하려면 JVM 기능을 사용해야 합니다.