다중 스레드 방식으로 TCP 소켓을 처리하는 프로그램(C++)이 있습니다. 멀티스레딩은 약 100개의 스레드(POSIX 스레드)로 매우 집약적입니다.
때로는 프로그램이 언제 종료될지 확실하지 않은 경우도 있습니다 SIGTERM
. 인터넷 검색 후에 시스템이 제대로 전송되지 않는 것을 발견했습니다 SIGTERM
. 나는 이 신호를 무시하면 어떤 일이 일어날지 알아보기로 결정했습니다. 이제 시스템이 SIGKILL
. 나는 그것이 를 사용하려고 시도할 것이라고 가정하고 SIGTERM
, 앱이 종료되지 않으면 시스템이 앱을 종료할 것입니다.
gdb에서 실행해 보았으나 아무런 신호도 받지 못했습니다.
Valgrind에서 실행했는데 신호가 없습니다. valgrind 오류도 없습니다. 메모리 소모는 정상이고 메모리 누수는 없는 것 같습니다. 종료되면 7Mb의 힙이 사용됩니다.
의심스러운 것은 없습니다 /var/log/messages, /var/log/syslogd
.
시스템은 데비안 2.6.32-5입니다.
기본적으로 질문은 시스템이 이를 임의의 프로세스에 SIGTERM
보낼 수 있는 이유는 무엇입니까? SIGKILL
그 시점에서 어떻게 멈추고 무슨 일이 일어나는지 볼 수 있습니까? (gdb가 동작을 변경합니다.)
답변1
"시스템"은 매우 모호한 용어입니다. 커널에 관해 이야기하면 커널은 절대 SIGTERM을 보내지 않습니다. OOM Killer가 호출되면 SIGKILL을 보냅니다.
스크립트에 버그가 있거나 명령이 프로세스와 일치하지 않을 pkill
수 있습니다. killall
start 명령을 사용하면 gdb
프로세스 이름과 인수가 달라서 pkill
/ 와 다르게 보입니다 killall
.
답변2
systemtap 스크립트를 가져와 신호 전달을 모니터링하세요. 가장 간단한 접근 방식이면 충분할 수 있습니다. 예를 들면 다음과 같습니다.https://sourceware.org/systemtap/examples/lwtools/killsnoop-nd.stp
예를 들어 킬러의 전체 프로세스 트리를 인쇄하도록 확장할 수 있습니다.
더 나은 스크립트는 시스템 호출을 모니터링하지 않고 신호가 실제로 전달되는 위치를 모니터링합니다. 그러한 스크립트를 작성하는 것은 독자의 연습 문제로 남겨집니다.