it-swarm-ko.tech

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

나는 항상 kill -9,하지만 다른 관리자가 거의 일상적으로하는 것을 봅니다.

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

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

일반적으로 kill -s TERM (kill -15 이전에 kill (kill -9의 약자 또는 대부분의 시스템 kill -s KILL)를 사용해야합니다. 대상 프로세스 자체를 정리할 기회. (프로세스는 SIGKILL를 잡거나 무시할 수 없지만 SIGTERM를 잡을 수 있습니다.) 프로세스가 수행중인 작업과 정리 작업을 완료 할 기회를주지 않으면 다시 시작하면 이해할 수없는 손상된 파일 (또는 다른 상태)이 남아있을 수 있습니다.

strace/truss, ltracegdb은 일반적으로 멈춤 프로세스가 멈추는 이유를 찾는 좋은 아이디어입니다. (Solaris의 truss -u가 특히 유용합니다. ltrace은 (는) 너무 자주 라이브러리 호출에 인수를 사용할 수없는 형식으로 표시합니다.) Solaris에도 유용한 /proc 기반 도구가 있습니다. 리눅스로 포팅되었습니다. (pstack가 종종 도움이됩니다).

366
geekosaur

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

(견적 가증)

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

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

1) 소켓 연결 종료

2) 임시 파일 정리

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

4) 단말기 특성 재설정

등등. 등등.

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

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

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

(.서명)

230
Shawn J. Goff

전원 케이블을 뽑아서 종료해도 항상 괜찮은 것처럼 항상 kill -9를 수행해도됩니다. 반사회적 일 수도 있고, 회복을 위해 남겨 두어야하지만, 작동해야하며 참을성이없는 사람을위한 강력한 도구입니다.

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

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

77
dbrower

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

most 프로그램 (데이터베이스조차도)도 마찬가지입니다. 건초가 없어도 죽일 수 없다면 실제로 사용하고 싶지 않습니다. (그리고 당신이 그들이 아닌 데이터를 유지하는 척하는 비 데이터베이스 중 하나를 사용한다면 : 글쎄, 당신이하고있는 일에 대해 생각하기 시작할 때가 된 것 같습니다).

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

People should 충돌에 강한 소프트웨어를 작성하십시오. 특히 서버에서. 일이 깨지거나 충돌하는 것으로 가정하는 소프트웨어를 설계하는 방법을 배워야합니다.

데스크톱 소프트웨어도 마찬가지입니다. 브라우저를 종료하려면 일반적으로 AGES를 종료해야합니다. nothing 내 브라우저 needs이 작업을 수행하려면 최대 2 초 이상이 소요됩니다. 종료를 요청하면 즉시 종료해야합니다. 잘 안되면, 우리는 kill -9를 꺼내서 만듭니다.

39
borud

프로세스가 kill -9이고 종료 될 수없는 경우 <defunct>가 전혀 작동하지 않는 경우에는 다른 모든 답변에 언급되지 않았습니다.

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

프로세스에 없어진 것이 무엇이고 왜 죽지 않는가?

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

참고 : ps -ef의 기능 .

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

10
Eduard Florinescu

절대로 절대로 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 신호를 보내기 만하면됩니다. 중단 된 프로세스로 마무리 할 수 ​​있습니다.

6
HandyGandy

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

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

또한 프로세스와 모든 하위 프로세스를 종료하려면 PID 자체가 아닌 부정 PID를 사용하여 kill을 호출하는 습관을 가지십시오. SIGHUP, SIGPIPE 또는 SIGINT 또는 그 이후의 다른 신호 정리를 보장 할 수 없으며 정리할 수없는 많은 프로세스 (잡종 기억)가 성가신 일입니다.

Bonus evil : kill -9 -1kill -9 1보다 약간 더 손상되었습니다 (중요하지 않은 VM에서 발생하는 일을보고 싶지 않다면 루트로하지 마십시오)

5
dhchdhd

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

그것은 stackoverflow 와 매우 유사한 질문에서 내 완전한 대답 2 을 기반으로합니다.

모든 설명을 읽을 수 있습니다. 요약하면 SIGTERMSIGKILL 또는 SIGTERM, SIGINTSIGKILL 만 권장합니다. 그러나 나는 완전한 대답에서 더 많은 옵션을 제공합니다.

Github에서 자유롭게 다운로드 (복제)하십시오. 죽이는 저장소1

3
Dr Beco

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

man 7 signal에 따르면 :

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

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

프로세스에서 kill -9를 실행하기 전에 수행해야 할 작업

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

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