상기 Unix
명령 줄 경우 I 프레스 Ctrl-C하지만 오히려 인터럽트, 프로세스를 종료하고 내가 프롬프트 쉘에 반환하지 않습니다.
그래서 다음 두 가지 질문이 있습니다.
- 중단 된 모든 프로세스 목록을보고 종료 할 수있는 방법이 있습니까?
- 프로세스를 중단하지 않고 눌러야하는 키 조합은 무엇입니까?
상기 Unix
명령 줄 경우 I 프레스 Ctrl-C하지만 오히려 인터럽트, 프로세스를 종료하고 내가 프롬프트 쉘에 반환하지 않습니다.
그래서 다음 두 가지 질문이 있습니다.
답변:
Ctrl+ C는을 보냅니다 SIGINT
. 기본적으로 응용 프로그램이 종료됩니다.
이것을 Ctrl-Zbash 와 혼동 하여 bash에서 응용 프로그램을 일시 중단합니다.
역사적으로 키 스트로크에 묶인 세 가지 신호가있었습니다.
일부 * nix 특징에는 다른 신호도 바인딩되어 있습니다. 명령을 사용하여 키보드 바인딩을 확인할 수 있습니다
stty -a
내 시스템 OS / X에서 다음과 같은 출력이 생성됩니다.
speed 9600 baud; 65 rows; 213 columns;
lflags: icanon isig iexten echo echoe -echok echoke -echonl echoctl
-echoprt -altwerase -noflsh -tostop -flusho pendin -nokerninfo
-extproc
iflags: -istrip icrnl -inlcr -igncr ixon -ixoff ixany imaxbel iutf8
-ignbrk brkint -inpck -ignpar -parmrk
oflags: opost onlcr -oxtabs -onocr -onlret
cflags: cread cs8 -parenb -parodd hupcl -clocal -cstopb -crtscts -dsrflow
-dtrflow -mdmbuf
cchars: discard = ^O; dsusp = ^Y; eof = ^D; eol = <undef>;
eol2 = <undef>; erase = ^?; intr = ^C; kill = ^U; lnext = ^V;
min = 1; quit = ^\; reprint = ^R; start = ^Q; status = ^T;
stop = ^S; susp = ^Z; time = 0; werase = ^W;
이 인스턴스에서 kill은 현재 입력 버퍼를 지우는 것과 관련된 KILL 신호가 아닙니다.
SIGQUIT를 사용하여 프로세스를 중지하면 더 성공할 수 있지만 프로세스가 신호를 포착하여 무시할 수 있으므로 사실이 아닐 수 있습니다.
프로세스가 인터럽트를 포착하고 무시했거나 종료 했으므로 "인터럽트 된"프로세스 목록의 개념은 없습니다. 작업을 입력하여 일시 중단 된 프로세스 목록을 얻을 수 있습니다.
많은 정답이 있지만 완전한 것은 없습니다.
극단적 인 편견으로 프로세스를 중지시키지 않고 종료하려면 기본적으로 어떤 키에도 바인딩되지 않은 SIGKILL을 사용하십시오. 대신 일반적으로 kill (1)
명령을 사용하여 다음 과 같이 보낼 신호를 지정하십시오.
$ kill -9 <process ID>
또는 니모닉
$ kill -KILL <process ID>
이 신호는 OS에 의해 직접 처리되며 프로그램은 기본 동작을 무시할 수 없습니다 .
쉘이 작업 제어를 지원하는 경우 catwalk 's answer 에서와 같이 문자를 kill
사용하여 작업 식별을 지원하는 내장 버전을 지원할 수도 있습니다 .%
fg
터미널 제어를 계속하거나 터미널 제어를 유지 하지 않고bg
실행하도록 설정하여 (그러나 기본적으로 여전히 출력을 전송 함) 이러한 프로세스를 재개 합니다.Ctrl-C는 SIGINT를 보내면 기본적으로 프로세스가 종료되지만을 \bin sh
사용하여 트랩 될 수 있습니다 trap
.
SIGKILL은 취소 할 수없는 킬 신호입니다.
편집 세 번째 시간, 나는 이것이 바로 생각 : 나는 문서에 대한 모든 것을 확인했습니다. 우리는 볼 수 있습니다.
이것은 대부분의 터미널 초보자에게는 분명하지 않지만 문제가 대화 형 프로그램에 있고 나가는 방법을 알 수없는 경우 종종 q
종료됩니다. 예를 들어, 이것은 종료 키이며, 페이지 less
를 볼 때 얻는 프로그램이기도합니다 man
.
일부 프로그램에는 다른 바로 가기 키가 있습니다. 에서 vim
또는 vi
사용 ESC:wq
. 에서을 emacs
사용하십시오 Control-C Control-X
. 에서 nano
또는 pico
사용 Control-X
. 이 예제에는 특히 해당 바로 가기가 편집중인 파일의 변경 사항을 저장할지 여부와 관련하여 미묘한 점이 있습니다.
많은 프로세스가 인터럽트 핸들러를 설치하여 인터럽트 신호를 포착 할 수 있지만 기본적으로 중단되지 않는 프로세스를 처리합니다.
프로세스를 강제 종료하려면 SIGQUIT (Ctrl- \)를 보낼 수 있습니다.
다른 답변이 가능한 시나리오 인 것 같지만 자식을 올바르게 처리하지 않는 스크립트를 실행하고있을 수도 있습니다. 나는 최근에 비슷한 시나리오에 도달했다. 스크립트를 죽이면 그 스크립트의 자식 프로세스를 죽이지 않을 것이다.
일반적으로이 상황에 도달하면 실행중인 모든 프로세스를 검토해야합니다. ps에 대한 맨 페이지를 검토해야합니다. ( man ps
) 나는 특히 ps auxwf
프로세스 간의 부모 / 자식 관계를 보여주는를 사용 하는 것을 좋아 합니다. pstree
비슷한 일을합니다. 프로세스를 종료하기 전에 다른 터미널에서 이것을 실행 하여 정상적인 상황에서 어떤 모습인지 확인하고 하위 프로세스를 식별해야합니다.
그런 다음 주 프로세스를 (^ C로) 종료하면 ps의 출력을 다시 확인하여 변경된 것이 있는지 확인하십시오. 자식 프로세스가 여전히 주위에 있으면 kill
명령을 사용하여 프로세스를 종료 할 수 있습니다 . (참조 man kill
)
stty -ixon
그것들이 통과되도록 설정 한 것이 흥미 롭습니다 . 나는 그들이로 바뀔 것이라고 생각할 것입니다<undef>
.