왜 우리는 항상 kill -9를 사용합니까?

왜 우리는 항상 kill -9를 사용합니까?

킬 단계에 대해 알고 싶습니다. 우리는 항상 kill -9다른 번호 대신에 이 번호를 사용합니다. 누구든지 이유를 설명할 수 있습니까?

답변1

나는 실제로 Bob의 답변을 좋아합니다.

내가 사용하는 신호는 다음과 같습니다.

  • -1( -HUP) - 프로세스를 다시 시작합니다.
  • -2( -INT) - 프로세스 종료
  • -9( -KILL) - 커널에게 프로세스를 종료하라고 지시합니다.
  • -11( -SEGV) - 프로그램이 심각하게 충돌합니다.
  • -15( -TERM) - 기본적으로 프로그램을 종료해주세요.

신호 종료가 전송되지 않습니다 -15( -TERM).

위의 모든 신호 이름은 SIG접두사(예: -SIGKILL)로 지정할 수 있지만 이는 선택 사항입니다.

분할 오류로 인해 프로그램이 강제로 종료된다는 점에 유의하세요 kill -11. 가끔 이 방법을 사용하지만 kill -9프로세스가 종료되지는 않습니다. (발행 kill -9또는 kill -11진행 중일 경우 데이터가 손실될 수 있으니 주의하세요!)

ps -ef | grep <program>프로세스를 확인하는 데 사용됩니다 . 상위 프로세스가 PID 1인 프로세스를 삭제하려면 kill -HUP 1또는 kill -1 1(둘 다 루트로)를 사용해야 합니다 . PID 1은 귀하의 것입니다.시스템 초기화.

따라서 프로세스를 종료하려면 kill <pid>(정확히 와 동일 kill -15 <pid>) 실행하고, 실패하면 다른 것을 시도합니다(데이터가 손실될 수 있습니다!). kill -2 <pid>(실행과 유사 Ctrl+c) 실패하면 kill -9 <pid>실패 kill -11 <pid>하면 프로세스가 실행됩니다. 가장 좀비 프로세스가 있을 수 있으므로 ps -ef | grep <program_name>사용하는 경우 ps -ef | grep <pid>프로세스 후에 "만료됨"을 언급해야 합니다. 를 발행할 때입니다 kill -1 1.

일부 프로그램(예: Java JVM)은 신호가 수신될 때(문제 해결을 위해) 스레드/힙을 덤프하도록 구성할 수 있습니다. 이러한 경우에도 kill을 사용합니다...

답변2

처음에는 kill 명령/시스템 호출이 프로세스를 종료합니다. 이는 커널에 의해 수행되며 프로세스는 사라지고 아무런 알림도 받지 못합니다. 제 생각에는 이것이 3판쯤에서 멈춘 것 같습니다. Kill -9는 프로세스에 9번 신호를 보내는 것을 의미합니다. 대부분의(모두? 상황에 따라 다름) 다른 신호와는 달리 프로세스에서 "포착"할 수 없으며 어떤 방식으로든 처리할 수 없습니다. 프로세스를 중지하는 더 좋은 방법은 kill -15(또는 kill -TERM)입니다. 이는 프로세스가 종료되고 있음을 알리지만 정리를 수행할 기회를 제공합니다.

kill -9를 사용하는 것은 프로세스를 종료하는 "보장된" 방법입니다. 막혔을 경우 kill -15가 항상 작동하지 않을 수도 있습니다. 따라서 많은 사람들은 여전히 ​​kill -9를 "첫 번째 수단"으로 사용합니다.

"최종" 킬 신호가 숫자 9인 이유는 바로 그들이 하는 방식입니다. 당시에는 최소한 8개의 다른 신호가 있었고, 그 숫자는 커널의 해당 부분을 프로그래밍한 사람(아마도 Ken Thompson)이 할당한 것으로 추측됩니다. 더 낮은 숫자 중 일부는 PDP-11 하드웨어의 하드웨어 명령 및/또는 이벤트에 매핑되므로 이제 대부분 과거의 일이 되었습니다. 그리고 다른 많은 것들이 있습니다이상9.

실제 숫자에는 레벨이나 계층이 없습니다. 신호 8은 신호 9보다 "작거나" 신호 7보다 "큰" 것이 아닙니다.

답변3

음... 사람마다 프로그래밍 스타일이 다른 것 같아요. 개인적으로 나는 노력한다.피하다kill -9죽일 수 있는 프로세스가 실행되는 것을 허용하지 않기 때문에 좀비 프로세스를 생성하는 경향이 있으므로 가능하다면 보내십시오.어느사용자가 종료하려는 프로그램에 존재할 수도 있고 존재하지 않을 수도 있는 작업을 정리합니다.

이는 "최후의 수단" 신호이므로 드물지만첫번째 선택말하자면 "항상 작동"하기 때문에 일반적으로 사용되는 프로그램(특히 잘못 작성된 프로그램에서)을 종료하는 방법입니다.

프로세스가 SIGINT또는 을 무시하면 SIGTERM다음이 있습니다.~해야 한다이것이 한 가지 이유입니다. 프로세스가 종료되기 전에 잠금 파일을 해제하고, 일부 임시 파일을 삭제하고, 다른 "정리" 작업을 수행해야 할 수도 있습니다. 물론 프로그램은 실수를 하기 때문에 SIGKILL이러한 (희귀하기를 바라는) 시나리오가 꼭 필요합니다.

실제로 적절한 유일한 사용 SIGKILL은 프로세스가 어떤 이유로 오작동하고 제대로 종료되지 않는 경우 또는 사용자가 다른 이유로 프로세스를 즉시 종료해야 하는 경우(예: 실수로 트로이 목마를 실행하여 당황한 경우)입니다. 프로그램을 빠르고 완전하게 종료하고 싶습니다).

자주 보는 이유는 이것이 커널의 유일한 신호이기 때문입니다.할 수 없다소홀히 하다. 셸에서 trap명령을 실행하여 직접 확인할 수 있지만 이는 해당 명령이 수행하는 작업에 대한 좋은 설명을 제공합니다 kill -9.

우주에서 온 신호 9호

포착할 수 없는 신호가 있습니다: SIGKILL 또는 신호 9. 커널은 이 신호를 보내는 모든 프로세스를 즉시 종료하고 신호 처리를 수행하지 않습니다. 중단되거나 중단되거나 기타 문제가 있는 프로그램은 항상 종료되므로 무언가를 중지하고 실행해야 할 때 이것이 쉬운 방법이라고 생각하기 쉽습니다. 일반적으로 SIGKILL 신호를 보내는 다음 명령에 대한 참조를 볼 수 있습니다. kill -9

그러나 간단해 보이지만 이 신호를 보낼 때 애플리케이션은 아무런 처리도 하지 않는다는 점을 기억해야 합니다. 일반적으로 이는 괜찮지만 많은 프로그램에서는 그렇지 않습니다. 특히 많은 복잡한 프로그램(및 일부 덜 복잡한 프로그램)은 프로그램의 여러 복사본이 동시에 실행되는 것을 방지하기 위해 잠금 파일을 만듭니다. 잠긴 파일을 사용하는 프로그램에 SIGKILL이 전송되면 잠긴 파일을 삭제할 기회도 없이 종료됩니다. 잠금 파일이 있으면 잠금 파일을 수동으로 제거할 때까지 프로그램이 다시 시작되지 않습니다.

경고 받다. 최후의 수단으로 SIGKILL을 사용하십시오.

원천

답변4

제가 이 게시물을 좋아하는 이유는 제가 현장에서 아버지(80년대 초반)를 도우며 오래된 Burroughs/Unisys 시스템 작업을 하던 시절을 떠올리게 하기 때문입니다...지금까지,죽이다(다양한 이유로) 약간 진화했습니다.

먼저 답변을 주신 @thecarpy와 Bob에게 감사드립니다.

두번째,죽이다Unix/Unix 계열 시스템(또는 셸) 구현에 따라 다른 의미를 가질 수 있습니다. 처음에는,죽이다사용자가 메모리에서 활성 프로세스를 제거할 수 있도록 하는 모듈 기반/모놀리식 기반 커널에 대한 직접적인 시스템 호출입니다. 요점은 이 명령이 커널 공간(ring0), ring3(사용자 공간) 또는 더 높은 수준의 사용자가 오래된 메인/미드프레임 시스템 리소스를 빨아들이는 탐욕스러운/런어웨이 프로세스를 파괴하는 수단이라는 것입니다.

3. 전반적인 목적죽이다PID에 프로세스별/터미널별/런레벨별로 전송될 SIGKILL에 대한 핸들이 있는지 확인하는 것입니다.

유닉스 계열 시스템의 경우,킬 -9IMHO는 좀비 프로세스를 남길 수 있다는 이유로 너무 자주 사용됩니다. 이는 분기, 파이프 라이닝 및 초기 PID/프로세스 생성 하위 등에 기반한 상위->하위 PID 관계와 같은 다른 이유 때문입니다.

이 명령은 위험한 만큼 유용하지만, 관련 옵션(위에서 언급한 대로)과 문제가 있는 PID(셸 스크립트에서 핵심 데이터베이스 프로세스까지)를 이해하기 위해 먼저 조사해야 합니다.

ps-aef |

식별한 후에는 kill -15를 사용하여 좀비 및 런어웨이 프로세스(예: MySQL 초기)를 방지하여 시스템 리소스를 절약하지만 프로세스를 보내기 위한 올바른 신호를 아는 것도 중요합니다.https://en.wikipedia.org/wiki/Kill_(명령)

의심스러우면 사용해 보세요.삭제mariadb/httpd 또는 Kill -15와 같이 프로세스 이름을 지정하는 데 사용되는 명령으로 프로세스를 즉시 종료합니다.

관련 정보