SIGTERM 및 SIGKILL은 시스템이 정상적으로 작동할 때 전송됩니다.

SIGTERM 및 SIGKILL은 시스템이 정상적으로 작동할 때 전송됩니다.

다중 스레드 방식으로 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수 있습니다. killallstart 명령을 사용하면 gdb프로세스 이름과 인수가 달라서 pkill/ 와 다르게 보입니다 killall.

답변2

systemtap 스크립트를 가져와 신호 전달을 모니터링하세요. 가장 간단한 접근 방식이면 충분할 수 있습니다. 예를 들면 다음과 같습니다.https://sourceware.org/systemtap/examples/lwtools/killsnoop-nd.stp

예를 들어 킬러의 전체 프로세스 트리를 인쇄하도록 확장할 수 있습니다.

더 나은 스크립트는 시스템 호출을 모니터링하지 않고 신호가 실제로 전달되는 위치를 모니터링합니다. 그러한 스크립트를 작성하는 것은 독자의 연습 문제로 남겨집니다.

관련 정보