내 서버 프로그램이 SIGTERM을 수신하고 중지되었습니다 (종료 코드 0). 나는 그것에 대한 충분한 메모리가 있다고 확신하기 때문에 이것에 놀랐습니다. Linux (busybox)는 어떤 조건에서 SIGTERM을 프로세스에 보내나요?
댓글
답변
답변으로 게시하겠습니다. 이것이 문제로 판명되면 어떤 종류의 해결책이 있다는 것입니다.
종료 상태 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입니다.
$?
는 143 (128 + 신호 번호)으로 설정됩니다.