짧은 답변 : 전송 SIGTERM
, 30 초 후, SIGKILL
. 즉, 보내기 SIGTERM
, 잠시 기다립니다 (프로그램마다 다를 수 있으며 시스템을 더 잘 알 수 있지만 5 ~ 30 초면 충분합니다. 시스템을 종료 할 때 자동으로 1 분 30 초까지 대기하는 것을 볼 수 있습니다. 왜 서둘러, 결국?), 다음 보낼 SIGKILL
.
합리적인 답변 : SIGTERM
, SIGINT
, SIGKILL
이 충분 이상입니다. 이 프로세스는 것입니다 매우 아마도 이전에 종료 SIGKILL
.
긴 대답 : SIGTERM
, SIGINT
, SIGQUIT
, SIGABRT
,SIGKILL
이것은 불필요하지만 적어도 귀하의 메시지와 관련된 프로세스를 오도하는 것은 아닙니다. 이러한 모든 신호 는 프로세스가 수행중인 작업을 중지하고 종료하기를 원한다는 것을 의미합니다.
이 설명에서 어떤 답을 선택하든 그 점을 명심하십시오!
다른 것을 의미하는 신호를 보내면 프로세스가 매우 다른 방식으로 처리 할 수 있습니다. 반면에 프로세스가 신호를 처리하지 않으면 결국 무엇을 보내든 상관없이 프로세스가 종료됩니다 (물론 기본 작업이 종료되는 경우).
그래서 당신은 자신을 프로그래머로 생각해야합니다. SIGHUP
무언가와 연결된 프로그램을 종료하기 위해 함수 핸들러를 코딩 하시겠습니까 , 아니면 다시 연결을 시도하기 위해 반복 하시겠습니까? 이것이 여기서 주요 질문입니다! 그렇기 때문에 의도 한 바를 의미하는 신호 만 보내는 것이 중요합니다.
거의 어리석은 긴 대답 :
아래 표에는 관련 신호와 프로그램이 처리하지 않는 경우의 기본 동작이 포함되어 있습니다.
나는 내가 제안한 순서대로 주문했다 (BTW, 나는 여기가 아닌 합리적인 대답 을 사용하는 것이 좋습니다 ), 정말로 모든 것을 시도해야한다면 (테이블이 다음과 같이 정렬되어 있다고 말하는 것이 재미있을 것입니다. 그들이 야기 할 수있는 파괴, 그러나 그것은 완전히 사실 이 아닙니다 ).
별표 (*)가있는 신호는 권장 되지 않습니다. 이것들에 대한 중요한 것은 그것이 무엇을하도록 프로그램되어 있는지 결코 알 수 없다는 것입니다. 특별히 SIGUSR
! 그것은 종말을 시작할 수 있습니다 (프로그래머가 원하는 것은 무엇이든 할 수있는 무료 신호입니다!). 그러나 처리되지 않거나 또는 드물게 종료 처리되면 프로그램이 종료됩니다.
표에서 코어 덤프를 종료하고 생성하는 기본 옵션이있는 신호는 SIGKILL
.
Signal Value Action Comment
----------------------------------------------------------------------
SIGTERM 15 Term Termination signal
SIGINT 2 Term Famous CONTROL+C interrupt from keyboard
SIGHUP 1 Term Disconnected terminal or parent died
SIGPIPE 13 Term Broken pipe
SIGALRM(*) 14 Term Timer signal from alarm
SIGUSR2(*) 12 Term User-defined signal 2
SIGUSR1(*) 10 Term User-defined signal 1
SIGQUIT 3 Core CONTRL+\ or quit from keyboard
SIGABRT 6 Core Abort signal from abort(3)
SIGSEGV 11 Core Invalid memory reference
SIGILL 4 Core Illegal Instruction
SIGFPE 8 Core Floating point exception
SIGKILL 9 Term Kill signal
그럼 난 이것에 대한 제안 거의 바보 긴 대답 :
SIGTERM
, SIGINT
, SIGHUP
, SIGPIPE
, SIGQUIT
, SIGABRT
,SIGKILL
그리고 마지막으로
확실히 어리석은 긴 긴 대답 :
집에서 이것을 시도하지 마십시오.
SIGTERM
, SIGINT
, SIGHUP
, SIGPIPE
, SIGALRM
, SIGUSR2
, SIGUSR1
, SIGQUIT
, SIGABRT
, SIGSEGV
, SIGILL
, SIGFPE
아무것도, 일을하지 않는 경우 SIGKILL
.
SIGUSR2
SIGUSR1
프로그램이 신호를 처리하지 않으면 더 낫기 때문에 전에 시도해야합니다 . 그리고 SIGUSR1
그것들 중 하나만 처리 하면 처리 할 가능성이 훨씬 더 높습니다 .
BTW, the KILL : SIGKILL
다른 답변이 언급했듯이 프로세스 에 보내는 것은 잘못이 아닙니다 . 음, shutdown
명령 을 보내면 어떻게 될지 생각해 ? 그것은 시도 할 것이다 SIGTERM
및 SIGKILL
단지. 왜 그렇다고 생각하십니까? shutdown
명령이이 두 가지만 사용 한다면 왜 다른 신호가 필요 합니까?
이제 긴 대답으로 돌아가서 이것은 멋진 oneliner입니다.
for SIG in 15 2 3 6 9 ; do echo $SIG ; echo kill -$SIG $PID || break ; sleep 30 ; done
신호 사이에 30 초 동안 휴면합니다. 왜 oneliner 가 필요 합니까? ;)
또한, 추천 : 신호 만에 그것을 시도 15 2 9
로부터 합리적인 대답 .
안전 : echo
갈 준비가되면 두 번째를 제거하십시오 . 나는 그것을 내 전화 dry-run
에 대한 onliners . 항상 테스트에 사용하십시오.
killgracefully 스크립트
사실 저는이 질문에 흥미를 느꼈기 때문에 작은 스크립트를 작성하기로 결정했습니다. 여기에서 다운로드 (복제)하십시오.
Killgracefully 저장소에 대한 GitHub 링크