프로세스 -9를 언제 죽이지 말아야합니까?


401

나는 항상 실행을 매우 망설이지 kill -9만 다른 관리자가 거의 일상적으로 수행하는 것을 봅니다.

나는 아마도 합리적인 중간계가 있다고 생각합니다.

  1. 언제 그리고 왜 사용해야 kill -9합니까? 언제, 왜 안돼?
  2. 그것을하기 전에 무엇을 시도해야합니까?
  3. "정지 된"프로세스를 디버깅하면 어떤 문제가 발생할 수 있습니까?

7
좋은 관련 SO 답변 .
jw013

답변:


362

일반적으로 대상 프로세스가 자체적으로 정리 될 수 있도록하기 위해 ( ) 전에 ( ) 또는 (대부분의 시스템에서 kill짧게)를 사용해야 합니다. 프로세스는 캐치하거나 무시할 수 없지만 캐치 할 수 있으며 종종 캐치 할 수 있습니다 . 프로세스가 수행중인 작업을 완료하고 정리할 기회를 프로세스에 제공하지 않으면 손상된 파일 (또는 다른 상태)이 그 주위에 남을 수 있습니다. 다시 시작하면 이해할 수 없습니다.kill -s TERMkill -15kill -9kill -s KILLSIGKILLSIGTERM

strace/ truss, ltrace그리고 gdb일반적으로 멈춤 프로세스가 멈춘 이유를 찾는 좋은 아이디어입니다. ( truss -uSolaris에서는 특히 유용합니다. ltrace라이브러리 호출에 사용할 수없는 형식으로 인수를 너무 자주 제시하는 경우가 많습니다.) Solaris에는 유용한 /proc기반 도구가 있으며 그 중 일부는 Linux로 이식되었습니다. ( pstack종종 도움이 됨).


67
설득력있는 이유는 SIGKILL을 보내는 습관을들이는 경우, 예를 들어 자신이나 회사의 중요한 데이터베이스를 손상시킬 수있는 프로그램에 도착하면 정말 후회하게 될 것입니다. kill -9최후의 휴양지 종결 자로서 최후의 휴양지에 중점을두고있다; 마지막 리조트 이전에 사용하는 관리자 a) 관리자를 너무 잘 이해하지 못하며 b) 프로덕션 시스템에 있지 않아야합니다.
Arcege

9
@Mikel SIGINT / SIGTERM에 응답하지 않으면 SIGQUIT 또는 SIGSEGV와 같은 신호로 앱을 정리하는 것이 가장 좋습니다. 예를 들어, 전체 화면 3D 앱 또는 Xorg. SIGQUIT를 사용하면 아무것도 정리할 수 없지만 세그먼트 오류가 발생했다고 생각하여 속여서 정리하고 종료하는 것 외에는 선택의 여지가 없다고 느낄 것입니다.
penguin359

12
@Arcege -9로 죽이면 데이터를 손상시키는 데이터베이스를 사용하는 것이 결국 사용할 가치가있는 데이터베이스라고 생각하십니까? iirc, mysql, bdb, pg 등은 -9로 죽일 때 모두 잘 작동합니다.
dhruvbird

13
killall -9 java ftw
dmourati

23
@dhruvbird : DB에 방탄 조끼가 장착되어 있다고해서 꼭 필요하지 않다면 쏴야한다는 의미는 아닙니다. Arcege가 말하는 것만 큼 위험하지는 않다고 생각할 수도 있지만, 그의 요점은 여전히 ​​위험하며 최후의 수단이어야한다고 생각합니다.
iconoclast

228

Randal Schwartz는 자주 "x의 쓸모없는 사용"을 목록에 게시했습니다. 그러한 게시물 중 하나가에 관한 것 kill -9입니다. 여기에는 이유와 따르는 레시피가 포함됩니다. 다음은 재구성 된 버전입니다 (아래 인용).

(견적 가증)

아니, 아니. kill -9를 사용하지 마십시오.

프로세스가 깨끗하게 할 수있는 기회를주지 않습니다.

1) 소켓 연결 종료

2) 임시 파일 정리

3) 어린이들에게 멀리 가고 있음을 알리십시오.

4) 단말기 특성 재설정

등등. 등등.

일반적으로 15를 보내고 1 초 또는 2 초 정도 기다립니다. 그래도 문제가 해결되지 않으면 2를 보내십시오. 그래도 문제가 해결되지 않으면 1을 보내십시오. 그래도 문제가 해결되지 않으면 프로그램이 제대로 작동하지 않으므로 BINARY를 제거하십시오!

kill -9를 사용하지 마십시오. 화분을 정리하기 위해 콤바인 수확기를 꺼내지 마십시오.

쓸모없는 Usenet의 또 다른 사용,

(.서명)


12
프로세스가 종료 될 때 운영 체제가 열린 파일 디스크립터 (소켓 포함)를 닫지 않습니까?
Brian Gordon

3
그렇습니다. 그러나 클라이언트가 연결된 상태에서 서버 프로세스를 종료한다고 가정하면 클라이언트가 서버가 시간 초과되기 전에 서버가 종료되었음을 알 수 없습니다.
Björn Lindqvist

45
아 네, 예전 "어떤 방식 으로든 불완전하다면 그것을 사용하는 것은 바보입니다"라는 주장입니다.
Timmmm

3
또는 문제의 프로세스가 회사의 생산물 인 경우 사용하는 어리 석음
Warren P

3
프로세스가 종료되면 소켓은 피어에게 RST를 보내며, 프로세스가 소켓에서 닫기 또는 종료를 호출하는 것처럼 소켓은 FIN을 보냅니다. 시간 초과가 필요하지 않습니다. 타임 아웃 상황은 전원이 끊기거나 네트워크 케이블이 제거 된 경우에만 발생합니다.
ctrl-alt-delor

78

항상 확인해야한다 kill -9항상 전원 케이블을 당겨 종료에 확인을해야처럼. 그것은 반사회적 일 수 있고, 약간의 회복을 남겨 두어야하지만, 작동해야하며, 참을성이없는 사람들을위한 강력한 도구입니다.

나는 이것을 일반 살인 (15)을 먼저 시도 할 누군가라고 말한다. 왜냐하면 프로그램이 약간의 정리를 할 수있는 기회를주기 때문이다. 아마도 "시그 15에서 나가기"라는 로그에 쓸 것이다. 그러나 나는 살인 사건 9에 대한 나쁜 행동에 대한 불만을 받아들이지 않을 것입니다.

그 이유는 많은 고객이 프로그래머가 원하지 않는 일을하는 것입니다. 랜덤 킬 -9 테스트는 훌륭하고 공정한 테스트 시나리오이며 시스템에서 처리하지 않으면 시스템이 고장난 것입니다.


2
"random kill -9"는 어떻게 테스트합니까? kill -9를 받으면 완료됩니다.
Karel Bílek

18
@Karel : 시스템이 나중에 복구 될 수 있는지 테스트하고 SIGKILL시 처리되고 있던 엉망인 트랜잭션을 정리합니다.
Tadeusz A. Kadłubowski

7
어떻게 확인하지 않습니다 kill -9단지 등이 플러그를 해내 확인을하지 않습니다. 물론 선택의 여지가없는 상황이 있지만 이것이 최후의 수단이되어야합니다. 물론 전원 케이블을 잡아 당기거나 kill -9응용 프로그램이나 OS가 제대로 다시 시작되지 못하게하는 것과 같은 부작용이 없어야하지만 똥이 발생하고 권장 방법 ( kill [-15]) 또는 정기적 종료를 사용하면 다음과 같은 경우 발생할 수있는 혼란을 피할 수 있습니다 이런 식으로 프로그램과 OS를 정기적으로 중단시킵니다. 어쨌든 코드 견고성과 상관없이 데이터를 잃을 위험이 항상 있습니다.
jlliagre

7
Michael이 'OK'가 의미 한 바는 프로그램이이 상황을 정상적으로 처리하고 다시 시작할 때 어떤 형태의 정리 작업을 수행 할 수 있어야한다는 것입니다. 예를 들어, 장난감을 유모차에서 버리고 시작을 거부하는 대신 PID 파일 등을 정리하십시오.
gerryk

2
@gerryk 그들은 실제로해야하지만 문제는 어떤 사람들은 상황과 환경에 관계없이 "9를 죽일 수있는 라이센스"로 그 대답을 취할 것이라는 점입니다. 무책임한 태도입니다.
jlliagre

39

식기 세척기에 주방 도구를 던지는 것과 거의 같은 방식으로 kill -9를 사용합니다. 주방 도구가 식기 세척기에 의해 망가지면 원하지 않습니다.

동일은 간다 대부분의 프로그램 (심지어 데이터베이스) : 나는 상황이 엉망이하지 않고 그들을 죽일 수 없어 난 정말 그들을 사용하지 않으려면. (그리고 당신이 그들이 아닌 데이터를 유지하는 척하는 비 데이터베이스 중 하나를 사용한다면 : 글쎄, 당신이하고있는 일에 대해 생각하기 시작할 때가 된 것 같습니다).

현실 세계에서 물건은 어떤 이유로 든 언제든지 내려갈 수 있기 때문입니다.

사람들 충돌에 견딜 수있는 소프트웨어를 작성 해야합니다 . 특히 서버에서. 일이 깨지거나 충돌하는 것으로 가정하는 소프트웨어를 설계하는 방법을 배워야합니다.

데스크톱 소프트웨어도 마찬가지입니다. 브라우저를 종료하려면 일반적으로 AGES를 종료해야합니다. 없다 아무것도 내 브라우저가 필요 즉 초에 대부분의 부부보다 더해야 할이. 종료를 요청하면 즉시 종료해야합니다. 그렇지 않은 경우, 우리는 kill -9를 꺼내어 만듭니다.


4
나는 그러한 실패에 견딜 수있는 프로세스를 작성해야한다는 데 동의하지만, 그렇게하는 것은 여전히 ​​나쁜 습관이라고 생각합니다. 데이터베이스는 복구되지만 무례 중단을 감지 한 다음 다시 시작할 때 중요한 복구 검사를 트리거 할 수 있습니다. 프로세스가 제공하는 요청은 어떻습니까? 그들은 모두 즉시 단절 될 것입니다. 고객에게 버그가 있거나 실패 할 수도 있습니까?
Daniel James Bryars

3
언제든지 종료 할 수없는 데이터베이스는 제대로 신뢰할 수있는 데이터베이스가 아닙니다. 일관성이 필요한 경우 이것은 매우 기본적인 요구 사항입니다. 클라이언트의 경우 : 연결이 끊어졌을 때 데이터가 손상되어 데이터가 손상되면 잘못 설계되었습니다. 서비스 손실을 해결하는 방법은 중복 및 자동 장애 조치 / 재시도 전략을 이용하는 것입니다. 일반적으로 대부분의 시스템에서 빠른 실패는 복구 시도보다 선호됩니다.
borud

4
@borud 완벽하게 작성된 소프트웨어는 아니지만 사람들이 항상 사용하는 소프트웨어입니다. 갑작스런 중단으로부터 항상 정상적으로 복구 할 수 있도록 완벽하게 작성된 소프트웨어를 항상 선택할 수있는 고급 시스템 관리자는 무엇입니까? 많지 않습니다. 개인적으로 종료 스크립트를 사용하고이를 통해 프로세스를 시작 / 중지합니다. 그들이 프로세스에 대한 적절한 신호를 보내는 종료 스크립트에 응답하지 않으면 -9를 죽입니다.
Steve Sether

2
도구와 관련하여 기본 재료 요리와 더 복잡한 요리 사이에는 차이가 없습니다. 차이점은 요리사입니다. (그러나 요리하는 데 많은 시간을 할애한다면 주방 도구의 견고 함이 최소 요구 사항이며 소비자에게 주방 용품을 판매하는 대부분의 사람들이 훌륭한 도구로는 나쁜 도구를 알지 못할 것입니다.)
borud

1
따라서 일을 제대로하기가 어렵 기 때문에 사람들이 조잡 해 지도록 권장합니까? 임시 운영 환경에서 점점 더 많은 소프트웨어가 실행되고 있습니다. 올바르게 종료되지 않으면 까다로워지는 소프트웨어를 작성하는 경우 고용주가 개발자로 고용하도록 설득하기가 어렵습니다.
borud

10

kill -9프로세스가 종료 <defunct>되어 종료 할 수없는 경우 전혀 작동하지 않는 경우가 있습니다.

부모가 init 인 <defunct> 프로세스를 어떻게 죽일 수 있습니까?

프로세스의 기능 상실은 무엇이며 왜 프로세스가 종료되지 않습니까?

당신이 시도하기 전에 그래서 프로세스 실행 그의 부모가 무엇인지 확인하고 시도 (TERM) 또는 (INT) 그리고 마지막으로 자신의 부모에 (KILL)를.kill -9<defunct>ps -ef-15-2-9

참고 : 어떤 ps -ef않습니다 .

나중에 편집 및주의 : 프로세스, 부모 또는 자식 프로세스를 종료 할 때 파일을 열거 나 손상시킬 수 있고, 연결이 완료되지 않거나 데이터베이스가 손상 될 수 kill -9있으므로 프로세스를 위해 무엇을해야하는지 알지 못하는 경우 최후의 수단으로 만 사용하기 때문에주의해서 진행하십시오 , kill을 실행해야하는 경우 사용하기 전에 위에서 지정한 신호를 사용하십시오.-9 (KILL)


6

절대로하지 마십시오 kill -9 1. 또한 mount와 같은 특정 프로세스에서 종료를 피하십시오. 많은 프로세스를 종료해야하는 경우 (예 : X 세션이 중단되고 특정 사용자의 모든 프로세스를 종료해야하는 경우) 프로세스 순서를 반대로 바꿉니다. 예를 들면 다음과 같습니다.

ps -ef|remove all processes not matching a certain criteria| awk '{print $2}'|ruby -e '$A=stdin.readlines; A.reverse.each{|a| puts "kill -9 #{a}"}'|bash

명심 kill프로세스를 중지하고 자원을 해제하지 않습니다. 프로세스에 SIGKILL 신호를 보내기 만하면됩니다. 중단 된 프로세스로 마무리 할 수 ​​있습니다.


1
공감대는 다른 사람이었습니다. 그러나 어떤 리소스가 공개되지 않습니까? 프로세스가 정상적인 정리를 수행 할 수 없다는 것을 의미합니까? 파일 잠금, 세마포어 등은 어떻습니까? 정교하게 할 수 있습니까?
Mikel

SysV 공유 메모리 및 세마포어는 최소한 정리해야합니다. archives.postgresql.org/pgsql-general/2006-10/msg01065.php
Mikel

8
이 답변은 혼란스럽고 잘못되었습니다. kill -9 1대부분의 유니스에서는 무시됩니다. 피할 kill -9필요 mount는 없지만 그 어느 것도 지적 하지 않아도됩니다 . "프로세스 순서를 반대로"한다는 것이 무슨 의미인지 잘 모르겠습니다. kill -9불만을 제기 할 기회를주지 않고 프로세스를 중지 (종료)합니다. 그러나 프로세스가 인터럽트 불가능한 시스템 호출 인 경우 종료는 즉시 수행되지 않습니다 . 프로세스를 종료하면 kill -9대부분의 리소스가 해제되지만 전부는 아닙니다 .
Gilles

5

willy-nilly 프로세스를 강제 종료하는 것은 순조로운 이동이 아닙니다. 데이터가 손실 될 수 있고, 제대로 설계되지 않은 앱은 다시 설치하지 않고 해결할 수없는 미묘한 방식으로 깨질 수 있습니다. 주어진 상황. 그리고 무엇이 위험에 처할 것인가. 사용자는 프로세스가 무엇인지, 무엇을해야하는지, 그리고 제약 조건이 무엇인지 (디스크 IOPS, rss / swap) 알고 있어야하며 장기 실행 프로세스에 소요되는 시간 (파일 복사, mp3 재 인코딩, 이메일 마이그레이션, 백업, [좋아하는 타임 싱크].)

또한, SIGKILLpid로 보내는 것은 그것을 죽일 것을 보장하지 않습니다. syscall에 걸려 있거나 이미 좀비 ( Zin ps) 인 경우 계속 좀비가 될 수 있습니다. ^ Z는 오래 실행되는 프로세스이며 bg시도하기 전에 잊어 버리는 경우가 종종 kill -9있습니다. 간단한 방법으로 fgstdin / stdout을 다시 연결하고 프로세스를 차단 해제 한 다음 일반적으로 프로세스를 종료합니다. 다른 곳에 또는 다른 형태의 커널 교착 상태에 빠지면 재부팅만으로 프로세스를 제거 할 수 있습니다. (좀비 프로세스는 SIGKILL커널에 의해 처리 된 후 이미 죽었습니다 (추가 사용자 랜드 코드는 실행되지 않음). 일반적으로 프로세스가 종료되지 않는 커널 이유 (시스템 호출을 마치기 위해 "차단 된"것과 유사 함)가 있습니다.

당신이 프로세스와 모든 자식을 죽이고 싶어 경우에도, 전화의 습관을 kill부정 PID,뿐만 아니라 PID 자체 . 이의 보장은 없습니다 SIGHUP, SIGPIPE또는 SIGINT다른 신호는 후 청소 및 정리에 부인 프로세스 (잡종을 기억 하는가?) 성가신의 무리를 가지고.

보너스 악 : kill -9 -1보다 약간 더 해 롭습니다 kill -9 1(중요하지 않은 VM에서 일어나는 일을보고 싶지 않다면 루트로 사용하지 마십시오)


3

kill -9일반적으로 프로세스를 원하지 않는 이유

에 따르면 man 7 signal:

SIGKILL 및 SIGSTOP 신호는 포착, 차단 또는 무시할 수 없습니다.

즉, 이러한 신호 중 하나를 수신하는 응용 프로그램은 종료 동작을 수행하기 위해 신호를 "잡을"수 없습니다.

kill -9프로세스 를 실행하기 전에해야 할 일

신호를 프로세스에 보내기 전에 다음을 확인해야합니다.

  1. 프로세스가 사용 중이 아닌지 확인하십시오 (예 : "작업"수행). 를 kill -9프로세스에 전송 하면 본질적으로이 데이터가 손실됩니다.
  2. 프로세스가 응답하지 않는 데이터베이스 인 경우 먼저 캐시를 플러시했는지 확인하십시오. 일부 데이터베이스는 캐시를 강제로 플러시하기 위해 프로세스에 다른 신호 전송을 지원합니다.

3

이 문제를 자동화하는 데 도움이되는 스크립트를 만들었습니다.

그것은 stackoverflow 와 매우 비슷한 질문에 대한 완전한 답변 2 를 기반으로 합니다.

모든 설명을 읽을 수 있습니다. 난 그냥 추천 할 것입니다 요약하자면 SIGTERMSIGKILL, 또는 SIGTERM, SIGINT하고 SIGKILL. 그러나 나는 완전한 대답에서 더 많은 옵션을 제공합니다.

, 그것은 github의의에서 (복제)를 다운로드 해 주시기 바랍니다 killgracefully하는 저장소 1

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.