hadoop 클러스터에 kafka 머신이 있습니다.
Kafka 프로세스를 중지하는 스크립트는 다음 작업을 수행합니다.
PID 종료
그러나 우리는 kafka를 중지하는 스크립트가 실제로 프로세스를 종료하지 않는다는 것을 확인했습니다.
그래서 우리는 다음과 같이 (수동으로) 그것을 죽였습니다:
킬-9 PID
따라서 - 이 경우 프로세스는 -9에 의해 종료되어야 한다고 주장합니다(PID만 종료하는 대신).
스크립트의 예
function kafkaKill {
local localPID=$1
kill $localPID || return 1
for ((i=0; i<MAX_WAIT_TIME; i++)); do
kafkaIsRunning $localPID
if [ $? -eq 0 ]; then return 0; fi
sleep 1
done
kill -s KILL $localPID || return 1
for ((i=0; i<MAX_WAIT_TIME; i++)); do
kafkaIsRunning $localPID
if [ $? -eq 0 ]; then return 0; fi
sleep 1
done
return 1
}
답변1
기본적으로 프로세스에 표준 종료를 보내면 (Wikipedia에 따라) SIGTERM이 전송됩니다. 그 목적은 프로세스를 종료해야 함을 알리는 것입니다. 프로세스에 접근하는 좋은 방법은 다음과 같습니다.
- 프로세스 레지스터 SIGTERM에 대한 신호 처리기
- 이 프로세스를 종료하시겠습니까?
- kill을 통해 SIGTERM을 보냅니다.
- 신호 처리기가 호출되며 이는 프로세스에 대한 기회입니다.
- 열려 있는 파일 닫기
- 모든 버퍼 쓰기
- 모든 하위 스레드를 닫습니다.
SIGTERM을 보내도 프로세스가 강제로 종료되지는 않습니다. 완전히 무시할 수도 있고 원하는 것은 무엇이든 할 수도 있습니다.
Kill -9는 SIGKILL을 보냅니다. SIGKILL에 대한 핸들러를 등록할 수 없습니다. 이는 기본 핸들러가 호출됨을 의미합니다(제가 생각하는 커널 공간 - 여기에서 누군가 수정해 주세요). 이 경우 위의 작업을 수행할 기회가 없으며 실행 가능한 프로세스 목록에서 해당 프로세스가 즉시 제거되고 해당 메모리와 모든 내용이 삭제됩니다. 파일에 쓰는 경우 분명히 문제가 발생할 수 있습니다.
일부 프로세스는 종료되기 전에 여러 SIGTERM 신호를 허용합니다. 이것을 시도해 보셨습니까? 프로세스는 프로세스를 완전히 종료하기 위해 보낼 수 있는 신호를 기록할 수도 있습니다.
잘못된 상태의 프로세스는 신호 처리기를 등록했더라도 신호 처리기에 액세스할 수 없습니다. 신호를 수신할 수 없는 지점이 있습니다(정전 상태이거나 이미 다른 신호를 처리 중이거나 현재로서는 확인할 수 없는 다른 신호도 있음). 어떤 이유로든 프로세스가 중단되면 SIGTERM 핸들러는 전송 횟수에 관계없이 절대 실행되지 않습니다. 여기서 유일한 해결책은 SIGKILL이지만 이 신호가 무시되어 시스템 재부팅이 필요한 경우도 보았습니다.
실제 답변
귀하의 질문에 대답하려면 - 어떤 상황에서 무시하고 -9로 죽이기를 주장합니까?
- 프로세스가 프로세스를 명시적으로 종료하지 않는 SIGTERM 핸들러를 등록했습니다(참고 - 기본 SIGTERM은 프로세스를 종료합니다).
- 프로세스가 신호 차단 상태에 멈춰 있고 SIGTERM 핸들러를 실행할 수 없습니다.