Ctrl + C로 프로세스를 종료 할 수없는 경우 어떻게해야합니까?


170

Ctrl+ C는 현재 프로세스를 종료하는 데 항상 작동하지는 않습니다 (예 : 특정 네트워크 작업에서 프로세스가 사용중인 경우). 이 경우 커서 옆에 "^ C"가 표시되고 다른 기능은 수행 할 수 없습니다.

터미널을 잃지 않고 프로세스를 강제 종료하는 가장 쉬운 방법은 무엇입니까?

답변의 요약 : 일반적으로, 당신은 할 수 있습니다 Ctrl+ Z할 다음 잠 과정을 넣어하는 kill -9 _process-pid_당신이 프로세스의 PID를 찾을 경우, PS 및 기타 도구를. 에 배쉬 (그리고 아마도 다른 쉘)을 수행 할 수 있습니다 kill -9 %1쉽게 (일반 또는 '% N')를. 경우 Ctrl+가 Z작동하지 않습니다, 당신은 다른 터미널을 열고해야합니다 죽일 거기에서.


screen가능한 해결책이 될 것입니다. 새 창과 kill프로세스 를 만들 수 있습니다 .
바비

2
당신이 이미 화면에 있다고 가정 :)
Dustin Boswell

답변:


118

Ctrl+ C가 작동하지 않는 이유를 이해하려면 그것을 누를 때 발생하는 일을 이해하는 것이 매우 도움이됩니다.

대부분의 쉘은 Ctrl+ C를 바인딩 하여 " 현재 포 그라운드에서 실행되는 프로그램에 SIGINT 신호를 보냅니다 ". man signal을 통해 다른 신호에 대해 읽을 수 있습니다 .

 SIGINT        2       Term    Interrupt from keyboard

프로그램은 SIGTSTP 도 무시할 수 있으므로 해당 신호를 무시할 수 있습니다.

 SIGTSTP   18,20,24    Stop    Stop typed at tty

( Ctrl+ 를 누를 때 대부분의 쉘이 수행 Z하는 것이기 때문에 작동하지 않을 수 있습니다.)

프로세스에서 무시할 수없는 일부 신호가 있습니다 : SIGKILL , SIGSTOP 및 기타 신호. kill 명령을 통해 이러한 신호를 보낼 수 있습니다 . 따라서 교수형 / 좀비 프로세스를 종료하려면 프로세스 ID (PID)를 찾으십시오 . 예를 들어, pgrep또는 ps다음을 사용 kill하십시오.

 % kill -9 PID

13
단순한 말입니다. "좀비"는 기술적으로 프로세스 상태이며 "좀비"의 의미와 동일하지 않습니다. (대기하지 않은 종료 프로세스 () - 해당 부모 ED 좀비에 ( Z) 상태이 경우, 이상 신호를 처리 할 수 없다.).
스테판 히메네스

아아, 때로는 ctrl + c, ctrl + z 및 ctrl + \는 모두 아무것도하지 않으며 프로세스는 실행 취소 sudo (암호없이 허용됨)를 실행하므로 프로세스에 신호를 보낼 수는 없습니다.
Michael

111

경우 Ctrl+ C(SIGINT)이 작동하지 않습니다 시도 Ctrl+ \(SIGQUIT를). 그런 다음 Ctrl+ Z(SIGTSTP)를 시도하십시오 . 쉘 프롬프트로 돌아 가면 kill프로세스 ID를 수행하십시오. (당신이 지정할 수 SIGTERM 신호,이 기본값 kill -TERM. 일부 쉘에서 사용할 수 있습니다 %1. PID를 참조하는) 문제가 해결되지 않으면, 다른 터미널 또는 SSH 세션으로 이동 할 kill또는 kill -TERM온 프로세스 ID. 프로세스를 완전히 중단하고 열려있는 파일을 동기화하고 임시 파일을 제거하고 네트워크 연결을 닫는 등의 기회를 제공하지 않기 때문에 최후의 수단으로kill -KILL 일명 일명 해야합니다 kill -9.


32

Ctrl-Z를 눌러 프로그램일시 중단하고 백그라운드에 놓으십시오 .

Suspend the program currently running and put it in the background.
This does not stop the process as it does in VMS!

(을 사용하여 다시 포 그라운드로 복원 fg)

그런 다음 프로세스 ID가 주어지면 ( kill또는 kill -9에서 가져옵니다 ps a).


13
당신이 할 수 떠들썩한 파티와 kill $!같이 $!마지막 백그라운드로 프로그램의 PID를 포함하는 특별한 변수입니다.
Lloeki

@Lloeki 나를 위해 작동하지 않습니다 (적어도 신뢰할 수는 없습니다). 내가해야 할 bg변수가 할당 된 값을 가져옵니다 번 전에.
Daniel Beck

2
@ 다니엘, 맞아. 내가 마지막으로 백그라운드 프로세스를 말했듯이 bgCtrl + Z 직후에는 일시 중단되어야합니다.
Lloeki

2
참고 : 이것은 단지 트릭이 아니며 ps출력 (또는 killall)을 사용 하는 것은 동일한 이름을 가진 여러 프로세스가있는 경우 매우 위험합니다. ps -e -o pid,command프로그램 이름뿐만 아니라 pid + 전체 인수를 제공하지만 다시 구별하기에는 충분하지 않을 수 있습니다. 대조적 $!으로 명중입니다.
Lloeki

1
@Lloeki 동의하지 않습니다. ps a내 시스템의 출력 라인 예제 : 동일한 tty ( ) 에서 같은 명령 ( ) 의 27721 s000 T 0:00.09 top일시 중단 된 T인스턴스 ( , 인스턴스 수 top)가 몇 개 s000입니까?
Daniel Beck

29

링크 도 참조하십시오 .

Ctrl+ Z: 프로세스를 일시 정지합니다.

Ctrl+ C: 프로세스 종료를 정중하게 요청합니다.

Ctrl+ \: 현재 포 그라운드에있는 프로세스를 무자비하게 종료


"ctrl"+ "\"나를 위해 일하지 않았다
Benyamin Jafari

13

일반적으로 프로세스 ( Ctrl+ Z)를 중지 한 다음을 사용할 수 있습니다 kill -9. 의 경우 먼저 프로세스 PIDkill -9 가 필요합니다 . 백그라운드 작업의 경우 가장 쉬운 방법 입니다. 종료 하려는 백그라운드 작업의 수를 모르는 경우 실행하십시오 .kill -9 %1jobs

또는 프로세스 ID를 찾을 수 있습니다.

ps

그럼 당신은 실행할 수 있습니다

kill -9 <Appropriate PID from ps output>

4

콘솔과 다중 사용자 모드에있는 경우 1), 당신은 CTRL-ALT-Fn을 누르십시오 수 있고 다른 화면 사용에 로그인 ps -ef | grep <myprocessname>하거나 pidof <myprocessname>죽일 -9 ID 번호로 과정을 다음과.

2) 원격으로 연결된 경우 다른 터미널 세션을 통해 동일한 작업을 수행하십시오.

htop 을 설치하여 삶을 조금 더 쉽게 만들 수 있습니다. htop 은 실행중인 프로세스를 선택적으로 종료 할 수있는보다 다양한 버전의 top입니다. 대부분의 배포판은 저장소에서 중단됩니다.

3) 중단 된 ssh 세션 (예 : 다른 시스템)에 막힌 경우, 이스케이프 키인 물결표 (~)를 누른 다음 CTRL-Z를 눌러 호스트 세션으로 되돌아갑니다. 붙어있는 ssh 프로세스를 종료하거나 시간 초과 될 때까지 기다릴 수 있습니다.


4

Bash (및 다른 쉘)에 대한 간단한 솔루션은 다음과 같습니다.

Ctrl-z      followed by     kill -9 %1

여기서 '% 1'은 종료중인 작업 번호를 나타냅니다. 이미 다른 작업을 자고있는 경우 '% 2'(또는 다른 것) 일 수 있습니다. Ctrl-z를 눌렀을 때의 작업 번호를 확인할 수 있습니다.

[1]+  Stopped                 <process name>

'kill'은 / bin / kill이 아니라 쉘의 kill 버전입니다.


0

tmux 또는 화면을 사용 중이고 위의 작업 중 어느 것도 작동하지 않으면 여전히 창을 죽일 수 <prefix> x있으며 프로세스도 종료됩니다.


0

/ etc / profile에 SIGINT (2)로 설정된 트랩이있을 수 있습니다. 그렇다면 제거하십시오. 로그 아웃했다가 다시 로그인하면됩니다.

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