내 서버 프로그램이 SIGTERM을 수신하고 중지됩니다(종료 코드 0). 나는 그것이 충분한 메모리를 가지고 있다고 확신하기 때문에 이것에 놀랐습니다. Linux(busybox)는 어떤 조건에서 SIGTERM을 프로세스에 보냅니까?
답변1
문제가 발생할 경우 일종의 해결책을 찾을 수 있도록 이 내용을 답변으로 게시하겠습니다.
종료 상태 0은 프로그램이 정상적으로 종료되었음을 나타냅니다. 하나프로그램 종료종료 상태로 0에서 255 사이의 정수를 선택할 수 있습니다. 관례적으로 프로그램은 더 작은 값을 사용합니다. 쉘은 특별한 경우를 보고하기 위해 126 이상의 값을 사용하므로 이를 피하는 것이 가장 좋습니다.
C API 수준에서 프로그램은16비트 상태 보고¶프로그램의 종료 상태와 프로그램을 종료하는 신호(있는 경우)를 인코딩합니다.
껍질에는명령의 종료 상태(에 저장됨 $?
)은 프로그램의 실제 종료 상태를 신호 값과 결합합니다. 프로그램이 신호에 의해 종료된 경우 $?
128보다 큰 값으로 설정됩니다(대부분의 쉘의 경우 값은 128에 신호 번호를 더한 값입니다. ATT ksh는 256 + 신호 번호, yash는 384 + 세마포어 번호를 사용하여 모호성을 방지하지만 다른 쉘은 이를 따르지 않습니다.
특히, $?
0이면 프로그램이 정상적으로 종료된다.
여기에는 프로세스가 SIGTERM을 수신하지만 신호 처리기가 있고 결국 정상적으로 종료되는 상황이 포함됩니다(SIGTERM 신호의 간접적인 결과일 수도 있고 아닐 수도 있음).
제목의 질문에 답하기 위해 시스템은 SIGTERM을 자동으로 전송하지 않습니다. 터미널이 사라질 때 SIGHUP, 프로세스가 수행해서는 안되는 작업을 수행할 때 SIGSEGV/SIGBUS/SIGILL, 손상된 파이프/소켓에 쓸 때 SIGPIPE 등과 같이 자동으로 전송되는 일부 신호가 있습니다. 터미널의 키 누름으로 인해 전송되는 일부 신호가 있습니다. 주로 Ctrl+ 의 경우 SIGINT, + C의 경우 SIGQUIT , + 의 경우 SIGTSTP이지만 SIGTERM은 그중 하나가 아닙니다. 한 프로세스가 SIGTERM을 수신하면 다른 프로세스가 신호를 보냅니다.Ctrl\CtrlZ
1대략 말하자면
답변2
SIGTERM은 프로세스 종료를 관리하는 데 일반적으로 사용되는 신호입니다.
이는 커널이 보내는 신호는 아니지만 일반적으로 프로세스가 다른 프로세스를 (정상적으로) 종료하기 위해 보내는 신호입니다.
kill
이는 기본적으로 , pkill
, ... 명령 killall
에 의해 전송되는 신호 입니다.
service some-service stop
이는 데몬 프로세스를 중지하기 위해(예: SIGTERM 에서 ) 또는 종료 전 init
(SIGTERM에서 제 시간에 종료되지 못한 프로세스에 대해 SIGKILL이 뒤따름) 에 전송되는 신호입니다 .
SIGTERM은아니요신호가 전송되었습니다 ^C
. 전송된 신호 ^C
는 SIGINT입니다.
답변3
다른 답변 외에도 SIGTERM은 일반적으로 HPC 클러스터의 작업 스케줄러에서 실행되는 프로세스로 전송됩니다. 스케줄러는 일반적으로 SIGKILL을 사용하여 프로세스를 종료하기 전에 SIGTERM을 보냅니다.
- 진흙시간 제한을 초과하여 실행되는 작업의 경우 SIGTERM이 SIGKILL보다 먼저 전송됩니다.
- LSFSIGKILL에서 실행되는 작업의 경우 SIGINT가 먼저 전송되고 그 다음에 SIGTERM이 전송됩니다.시간또는메모리한계.
구성된 시간 제한에 따라 SIGTERM과 SIGKILL 사이에 프로세스가 완료될 가능성이 다소 있을 수 있습니다. 기본값은 수십 초 범위입니다.