시스템은 언제 SIGTERM을 프로세스에 전송합니까?

내 서버 프로그램이 SIGTERM을 수신하고 중지되었습니다 (종료 코드 0). 나는 그것에 대한 충분한 메모리가 있다고 확신하기 때문에 이것에 놀랐습니다. Linux (busybox)는 어떤 조건에서 SIGTERM을 프로세스에 보내나요?

댓글

  • 할 수 있습니다 ' 커널이나 표준 도구가 SIGTERM을 임의의 프로세스로 보내는 경우를 생각하지 마십시오. 프로그램의 진행 상황과 시작 방법에 대해 ' 무엇을 말씀해 주시겠습니까? 프로그램의 종료 상태를 ' 어떻게 알게 되었습니까? 문제를 재현 할 수 있습니까? 확인할 수있는 로그가 있습니까?
  • 직렬 회선을 읽고 쓰고 있으며 UDP 및 TCP 요청에 응답하고 있습니다. bash 스크립트에서 실행을 래핑 했으므로 종료 코드를 알고 있습니다.
  • Posix 문서는 SIGTERM이 엄격하게 사용자 수준 이벤트임을 나타냅니다. 다른 사람이 당신의 서버 프로그램을 죽일 수 있었을까요?
  • 당신입니다! 리턴 코드 0은 정상 종료를 의미합니다. SIGTERM이있는 경우 $?는 143 (128 + 신호 번호)으로 설정됩니다.
  • 또한 ^ C는 SIGTERM이 아니라 SIGINT입니다. 코드 130으로 종료합니다.

답변

답변으로 게시하겠습니다. 이것이 문제로 판명되면 어떤 종류의 해결책이 있다는 것입니다.

종료 상태 0은 성공적인 프로그램에서 정상적인 종료를 의미합니다. 종료 프로그램 은 종료 상태로 0에서 255 사이의 정수를 선택할 수 있습니다. 일반적으로 프로그램은 작은 값을 사용합니다. 126 이상의 값은 셸에서 특수 조건을보고하는 데 사용되므로이를 피하는 것이 가장 좋습니다.

C API 수준에서 프로그램은 report 프로그램의 종료 상태와 프로그램을 종료 한 신호 (있는 경우)를 모두 인코딩하는 16 비트 상태 ¹ .

셸에서 명령의 종료 상태 ($?에 저장 됨)는 프로그램의 실제 종료 상태와 신호 값을 결합합니다. 프로그램이 신호에 의해 종료되면 $?는 128보다 큰 값으로 설정됩니다 (대부분의 셸에서이 값은 128에 신호 번호를 더한 값입니다. ATT ksh는 256 + 신호 번호를 사용하고 yash는 384 + 신호 번호를 사용합니다. 모호함이 있지만 다른 셸은이를 따르지 않았습니다.

특히 $?가 0이면 프로그램이 정상적으로 종료 된 것입니다.

여기에는 SIGTERM을 수신하지만 이에 대한 시그널 핸들러가 있고 결국 정상적으로 종료되는 프로세스의 경우가 포함됩니다 (아마도 SIGTERM 신호의 간접적 인 결과 일 수도 있습니다.


제목의 질문에 답하기 위해 SIGTERM은 시스템에서 자동으로 전송되지 않습니다. 터미널이 사라질 때 SIGHUP, 프로세스가해야 할 일을 할 때 SIGSEGV / SIGBUS / SIGILL, 깨진 파이프 / 소켓에 쓸 때 SIGPIPE 등과 같이 자동으로 전송되는 몇 가지 신호가 있습니다. 터미널의 키 누름으로 인해 전송되는 몇 가지 신호, 주로 Ctrl + C 의 경우 SIGINT, Ctrl + 의 경우 SIGQUIT \ Ctrl + Z 에 대한 SIGTSTP이지만 SIGTERM은 이들 중 하나가 아닙니다. 프로세스가 SIGTERM을 수신하면 다른 프로세스가 해당 신호를 보냈습니다.

¹ 대략적으로 말하면

댓글

  • 신호 수신시 종료 상태가 결정되는 방법에 대한 좋은 설명입니다. 그러나이 답변은 ' OP '의 질문을 다루지 않습니다.
  • @codeforester 제목에있는 질문이 아니라 본문에있는 질문 중 하나입니다. 오해를 기반으로했기 때문에 약간 지저분합니다. I ' 나머지에 대한 몇 단어를 추가합니다.
  • 쉘에 따라 다릅니다. ksh93에서는 ' 256 + signum, yash에서는 ' 384 + signum
  • 참고 256 a la ksh 이상의 값을 사용하는 것이 반드시 exit로 전달되는 것을 방지하므로 더 좋은 것은 아닙니다. yash 접근 방식은 좋은 절충안이지만 다른 방법은 rc를 참조하십시오. 프로세스 종료시 기본 종료 코드?

Answer

SIGTERM은 일반적으로 프로세스를 관리적으로 종료하는 데 사용되는 신호입니다.

이것은 커널이 보내는 신호가 아니지만 프로세스가 일반적으로 보내는 신호입니다. (정상적으로) 다른 프로세스를 종료하기 위해 전송합니다.

이것이 kill, pkill, killall … 명령.

이것은 데몬을 중지하기 위해 데몬으로 전송되거나 (예 : service some-service stop) init 종료 전 (SIGTERM에서 제 시간에 종료되지 않은 프로세스에 대해 SIGKILL이 이어짐).

SIGTERM은 에서 전송되는 신호가 아닙니다 . div id = “32cc05daec”>

. ^C에 전송되는 신호는 SIGINT입니다.

답글 남기기

이메일 주소를 발행하지 않을 것입니다. 필수 항목은 *(으)로 표시합니다