프로세스를 중단하는 대신 Unix에서 프로세스 종료


12

상기 Unix명령 줄 경우 I 프레스 Ctrl-C하지만 오히려 인터럽트, 프로세스를 종료하고 내가 프롬프트 쉘에 반환하지 않습니다.

그래서 다음 두 가지 질문이 있습니다.

    1. 중단 된 모든 프로세스 목록을보고 종료 할 수있는 방법이 있습니까?
    1. 프로세스를 중단하지 않고 눌러야하는 키 조합은 무엇입니까?

답변:



7

역사적으로 키 스트로크에 묶인 세 가지 신호가있었습니다.

  • SIGINT (인터럽트) 보통 Ctrl+ C또는Del
  • SIGQUIT-종료-보통 Ctrl+\
  • SIGSUSP Suspend-일반적으로 Ctrl+Z

일부 * 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를 사용하여 프로세스를 중지하면 더 성공할 수 있지만 프로세스가 신호를 포착하여 무시할 수 있으므로 사실이 아닐 수 있습니다.

프로세스가 인터럽트를 포착하고 무시했거나 종료 했으므로 "인터럽트 된"프로세스 목록의 개념은 없습니다. 작업을 입력하여 일시 중단 된 프로세스 목록을 얻을 수 있습니다.


^ Q와 ^ S가 (당신처럼) 표시되어 있지만 stty -ixon그것들이 통과되도록 설정 한 것이 흥미 롭습니다 . 나는 그들이로 바뀔 것이라고 생각할 것입니다 <undef>.
추후 공지가있을 때까지 일시 중지되었습니다.

OS X 상자 또는 Debian Lenny 상자의 매뉴얼 페이지에서 SIGSUSP를 찾을 수 없습니다. SIGTSTP 인 것 같습니다.
dmckee --- 전 운영자 고양이

델-아, 계획 9 ...
새로운 123456

5

많은 정답이 있지만 완전한 것은 없습니다.

  1. 다른 많은 사람들이 말했듯이 : Control-C는 일반적으로 유닉스 신호 SIGINT를 보내고 기본 동작 (대신하지 않는 프로그램의)은 "종료 프로세스"입니다. 프로그램은이 신호를 무시하거나 원하는 경우 다른 조치를 취할 수 있습니다.
  2. Control- \를 사용하여 키보드에서 SIGQUIT를 보낼 수도 있습니다. 차이점은 기본적으로 프로세스가 코어 파일을 작성한 다음 종료한다는 것입니다. 프로그램은이 신호를 무시하거나 원하는 경우 다른 조치를 취할 수 있습니다.
  3. 극단적 인 편견으로 프로세스를 중지시키지 않고 종료하려면 기본적으로 어떤 키에도 바인딩되지 않은 SIGKILL을 사용하십시오. 대신 일반적으로 kill (1)명령을 사용하여 다음 과 같이 보낼 신호를 지정하십시오.

    $ kill -9 <process ID>
    

    또는 니모닉

    $ kill -KILL <process ID>
    

    이 신호는 OS에 의해 직접 처리되며 프로그램은 기본 동작을 무시할 수 없습니다 .

  4. 쉘이 작업 제어를 지원하는 경우 catwalk 's answer 에서와 같이 문자를 kill사용하여 작업 식별을 지원하는 내장 버전을 지원할 수도 있습니다 .%

  5. 재개 가능한 방식으로 프로세스를 일시 중지하려면 SIGTSTP를 보내는 Control-z를 사용하십시오. fg터미널 제어를 계속하거나 터미널 제어를 유지 하지 않고bg 실행하도록 설정하여 (그러나 기본적으로 여전히 출력을 전송 함) 이러한 프로세스를 재개 합니다.

또한 SIGQUIT의 코어 덤프는 많은 관리 세부 사항에 따라 다릅니다. Solaris의 ulimit -c, coreadm (1M). 또 다른 참고 사항-fg는 SIGCONT 신호를 전송하여 프로세스가 작업을 재개하도록합니다.
Tadeusz A. Kadłubowski

1
  1. 백그라운드 프로세스 목록을 보려면 jobs

    강제 종료 : kill %1( jobs출력 에서와 같이 해당 작업 ID로 1을 대체하십시오 )

  2. 여기를 참조 하십시오

1

Ctrl-C는 SIGINT를 보내면 기본적으로 프로세스가 종료되지만을 \bin sh사용하여 트랩 될 수 있습니다 trap.

SIGKILL은 취소 할 수없는 킬 신호입니다.

편집 세 번째 시간, 나는 이것이 바로 생각 : 나는 문서에 대한 모든 것을 확인했습니다. 우리는 볼 수 있습니다.


SIGKILL은 트랩 할 수 없습니다.

네. 나는 이미 그것을 고쳤다.
Charles Stewart

1

이것은 대부분의 터미널 초보자에게는 분명하지 않지만 문제가 대화 형 프로그램에 있고 나가는 방법을 알 수없는 경우 종종 q종료됩니다. 예를 들어, 이것은 종료 키이며, 페이지 less를 볼 때 얻는 프로그램이기도합니다 man.

일부 프로그램에는 다른 바로 가기 키가 있습니다. 에서 vim또는 vi사용 ESC:wq. 에서을 emacs사용하십시오 Control-C Control-X. 에서 nano또는 pico사용 Control-X. 이 예제에는 특히 해당 바로 가기가 편집중인 파일의 변경 사항을 저장할지 여부와 관련하여 미묘한 점이 있습니다.


표준은 무엇입니까?
Pacerier

0

많은 프로세스가 인터럽트 핸들러를 설치하여 인터럽트 신호를 포착 할 수 있지만 기본적으로 중단되지 않는 프로세스를 처리합니다.

프로세스를 강제 종료하려면 SIGQUIT (Ctrl- \)를 보낼 수 있습니다.


SIGQUIT는 갇힐 수 있으며 SIGKILL은 멈출 수 없습니다.
Charles Stewart

1
@Charles : 또 다른 차이점은 SIGQUIT는 기본적으로 코어를 덤프하지만 SIGKILL은 그렇지 않습니다.
Tadeusz A. Kadłubowski

0

다른 답변이 가능한 시나리오 인 것 같지만 자식을 올바르게 처리하지 않는 스크립트를 실행하고있을 수도 있습니다. 나는 최근에 비슷한 시나리오에 도달했다. 스크립트를 죽이면 그 스크립트의 자식 프로세스를 죽이지 않을 것이다.

일반적으로이 상황에 도달하면 실행중인 모든 프로세스를 검토해야합니다. ps에 대한 맨 페이지를 검토해야합니다. ( man ps) 나는 특히 ps auxwf프로세스 간의 부모 / 자식 관계를 보여주는를 사용 하는 것을 좋아 합니다. pstree비슷한 일을합니다. 프로세스를 종료하기 전에 다른 터미널에서 이것을 실행 하여 정상적인 상황에서 어떤 모습인지 확인하고 하위 프로세스를 식별해야합니다.

그런 다음 주 프로세스를 (^ C로) 종료하면 ps의 출력을 다시 확인하여 변경된 것이 있는지 확인하십시오. 자식 프로세스가 여전히 주위에 있으면 kill명령을 사용하여 프로세스를 종료 할 수 있습니다 . (참조 man kill)

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