짧은 답변 : 전송 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.
SIGUSR2SIGUSR1프로그램이 신호를 처리하지 않으면 더 낫기 때문에 전에 시도해야합니다 . 그리고 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 링크