"kill <PID>"는 프로세스를 실제로 죽이지 않는 이유는 무엇입니까?


118

명령 줄 기술을 향상 시키려고하는데 프로세스를 종료 할 수없는 문제가 발생했습니다. kill 22002200이 내 PID이고 프로세스가 종료되지 않은 곳에 입력 합니다. 몇 분 후 대기는 여전히 top하고 ps aux. 심지어 sudo로 입력을 시도했지만 결과가 없습니다.

왜 그런 아이디어가 있습니까?


편집하다

fg프로세스 목록을 업데이트 하는 이상한 종속성을 발견했습니다 .

x@xxx:/etc/grub.d$ ps
  PID TTY          TIME CMD
 1723 pts/0    00:00:00 bash
 2200 pts/0    00:00:00 top
 2202 pts/0    00:00:00 top
 2258 pts/0    00:00:00 ps
x@xxx:/etc/grub.d$ fg
top

x@xxx:/etc/grub.d$ ps
  PID TTY          TIME CMD
 1723 pts/0    00:00:00 bash
 2200 pts/0    00:00:00 top
 2620 pts/0    00:00:00 ps
x@xxx:/etc/grub.d$ fg
top

x@xxx:/etc/grub.d$ ps
  PID TTY          TIME CMD
 1723 pts/0    00:00:00 bash
 2621 pts/0    00:00:00 ps

어떤 과정 이었습니까? 프로세스가 제대로 작동하지 않았는지 확인 했습니까 ? 이 경우 부모 프로세스를 종료해야합니다.
htorque

프로세스는 top편집에 나열되어 있습니다. 방금 프로그램을 백그라운드에 넣고 다시 가져 오려고했습니다.
Patryk

2
CTRL-z를 사용하여 프로세스를 일시 중단하면 일시 중단되는 동안 (즉 , 프로세스 를 수행 fg하거나 bg처리 할 때까지) 대부분의 신호를 차단합니다.
nos

답변:


179

프로세스는 일부 신호를 무시할 수 있습니다. SIGKILL을 보내면 무시할 수 없으며 정리도하지 않습니다. 시험:

kill -9 {PID}

매뉴얼 페이지를 읽고 자세히 알아보십시오.

man kill

22
또한 매우 구체적인 상황 에서는 프로세스가 SIGKILL조차도 프로세스를 종료 할 수없는 좀비 / 비 기능 상태 일 수 있습니다. 이 경우 상위 프로세스를 찾아서 상위 프로세스를 종료해야합니다.
Lie Ryan

15
그 프로세스가 라인을 벗어나면 KILL DASH NINE입니다 !
scottl

4
때로는 부모 프로세스가없는 경우가 있습니다. 이러한 프로세스를 제거하는 유일한 방법은 시스템을 재부팅하는 것입니다.
user606723

2
kill 명령의 이름은 많은 사용자 (처음에는 저를 포함하여)에게 계속 오해의 소지가 있습니다. "kill X"라고 말할 때 이것은 실제로 X를 죽이고 다른 일을하지 않는다는 것을 의미합니다. 나는 이것이 변하지 않을 것을 이해하지만 그들이 더 정교한 이름을 고르기를 바란다 ...
rbaleksandar

1
후에도 kill -9작동하지 않고 프로세스가 여전히 정지 상태입니까?
Douglas Gaskell

42

경우 kill어떤 파라미터없이 호출되며, 이것은 신호 번호 15 (송신 SIGTERM). 이 신호는 프로세스에 의해 무시 될 수 있습니다. 이 신호는 프로세스를 정리 한 후 스스로 종료합니다. 좋은 방법입니다.

SIGKILL프로세스에서 무시할 수없는 신호 번호 9 ( )를 "송신"할 수도 있습니다. 커널은 프로세스 자체가 아니라 프로세스를 종료하기 때문에 프로세스는이를 인식하지 못합니다. 그것은 사악한 방법입니다.

하나는 kill -9 <pid>항상 작동 한다고 말합니다 . 그건 잘못된 생각 입니다. kill -9프로세스를 종료하지 않는 상황도 있습니다. 예를 들어 프로세스에 상태가있는 경우 D(무정전 절전 모드) 프로세스는 I / O를 기다릴 때마다 (일반적으로 그리 길지 않음)이 상태가됩니다. 따라서 프로세스가 I / O를 대기하고 (예를 들어 결함 하드 디스크에서) 올바르게 프로그래밍되지 않은 경우 (시간 초과) 프로세스를 종료 할 수 없습니다 . 당신이 뭘 하든지. 프로세스가 계속 진행되는 파일에 액세스 가능하게 만들 수 있습니다.


2
이것은 매우 유용합니다. 네트워크 디스크에 I / O 액세스가 중단되어 여러 번 경험했으며 동결 된 프로세스를 죽일 수없는 이유가 궁금했습니다. 이 특정 문제 및 해결 방법에 대한 추가 문서가 있습니까?
Sheljohn

7

kill이라는 이름에도 불구하고 실제로 프로세스를 종료하지는 않지만 신호를 보냅니다. 매뉴얼 페이지에서 :

kill - send a signal to a process

전송되는 기본 신호 kill [pid]SIGTERM 이며 일반적으로 반드시 프로세스를 종료하도록 요구하지는 않습니다. SIGTERM 신호를 보낼 때 행복하게 연주되는 프로그램을 작성할 수는 있지만 권장하지는 않습니다.

또 다른 일반적인 신호는 SIGHUP 인데, 이는 종종 프로그램이 구성 파일을 다시 읽도록 요청하는 데 사용됩니다.

정말로 프로그램을 죽이고 싶다면 SIGKILL 신호 를 사용해야합니다 kill -9 [pid].


2

프로세스를 일시 중단 한 것 같습니다 (아마도 터미널에서 Ctrl-Z를 누름). 이 상태에서는 프로세스가 정지되어 프로세스가 SIGTERM에 응답하지 않습니다. 'fg'를 실행하면 프로세스가 해동되므로 신호를 포착하고 자체 종료 할 수 있습니다. 'fg'가 프로세스 목록을 업데이트하는 것처럼 보이는 이유를 설명 할 수 있습니다.


1
연결된 터미널을 찾는 방법은 무엇입니까?
ruX

0

C ++에서 다음을 실행했습니다.

kill(4024, SIGKILL);

그리고 리눅스 (우분투) 터미널에서

$ ps -ax | grep my_su

결과는 다음과 같습니다.

4024 pts/1    Z+     0:00 [my_subscriber] <defunct>

겉보기에는 (4024) 여전히 살아 남았습니다. 그러나 위의 "kill"문이라고하는 상위 프로세스를 종료하자마자 4024는 더 이상 나타나지 않았습니다. 이제 나는 "결함이없는"프로세스가 단지 한 줄만 표시되었다고 판단하고 무시하기로 결정했습니다. 내 경험이 누군가를 도울 수 있기를 바랍니다. 건배!


0

또한 kill -l아키텍처별로 지원되는 신호를 표시하고 신호를 올바르게 전송하는 데 사용할 신호에 대해 자세히 알아볼 수 있습니다.

참고 : 다른 사람들이 언급했듯이 kill -9 {PID}좀비 프로세스가 아니면 사용을 권장하지 않습니다. 프로세스가 수신되면 SIGKILL은 청소 나 다른 적절한 절차없이 즉시 종료됩니다.


0

이것은 포트 80에서 실행되는 localhost를 약탈하는 데 사용 된 것입니다 (angular cli로) 포트 80에서 실행중인 앱 정보 얻기

sudo lsof -i tcp:80

After That 
sudo kill -9 3348

3348실행중인 프로세스의 pid는 어디에 있습니까?

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