SIGTSTP(Ctrl-Z)는 스크립트 명령으로 시작된 스크립트에 대해 작동하지 않습니다.

SIGTSTP(Ctrl-Z)는 스크립트 명령으로 시작된 스크립트에 대해 작동하지 않습니다.

참고: stdin 및 stdout을 파일에 기록하는 명령을 script나타냅니다 .script

script이 유틸리티를 사용하여 터미널의 텍스트 색상을 유지하면서 나중에 검사할 수 있도록 출력을 저장하는 스크립트를 실행하려고 합니다  .

  • CtrlZ+ () 를 사용하여 현재 스크립트를 일시 중지하려고 하면 SIGTSTP콘솔이 인쇄되고 ^Z스크립트가 중지되지 않습니다.
  • Ctrl그런 다음 +를 시도했습니다 .S ( SIGSTOP). 현재 실행 중인 스크립트는 정지되지만( htop모든 프로세스를 Z모달로 표시) 터미널을 해제하지는 않습니다.  Ctrl+ Q실제로 그들을 회복시키십시오.

지금은 왜인지 혼란스럽습니다SIGSTOP Ctrl+ S는 유효하지만 SIGTSTP( Ctrl+ Z)는 유효하지 않습니다.

막힐 가능성이 있다는 것을 알고 있지만 그렇게 할 이유가 없으며 SIGTSTP매뉴얼 페이지에도 이에 대한 내용이 없습니다. script나는 스크립트 인터프리터를 대화형 모드로 강제 전환하려고 시도했지만 결과는 나를 더욱 혼란스럽게 만들었습니다. Ctrl+ Z( )를 실행하면 SIGTSTP실행 중인 스크립트가 정지되지만 script스크립트가 완료된 후 종료되어 정지된 하위 프로세스가 모두 종료됨을 나타냅니다.

이런 상황에서 우아하게 버틸 수 있는 방법이 있나요? 또한, 무슨 일이 일어나고 있는지 정확히 설명할 수 있는 사람이 있나요?

답변1

다른 통과 도구( ssh, 등) 와 마찬가지로 Ctrl/Z와 같은 문자가 더 이상 인터럽트 screen를 생성하지 않도록 호출 터미널을 원시 모드로 전환합니다. 그런 다음 이러한 문자를 전달하고 내부 터미널 장치는 이를 "정상적으로" 처리하여 예상되는 신호를 생성합니다. 모든 프로세스는 캡처를 선택할 수 있지만 캡처할 수는 없습니다 .tmuxscriptSIGTSTPSIGSTOP

$이 예에서는 명령줄 프롬프트를 표시하는 데 사용합니다 .

$ script
Script started, output log file is 'typescript'.
$ sleep 5    # After starting this I hit Ctrl/Z

[1]+  Stopped                 sleep 5
$

script자신에게 신호를 보내면 혼란 SIGTSTP스러워지고(프로그래밍 오류일까요?) SIGCONT복구되지 않는 것 같습니다. 그러나 전송 SIGINT또는 기타 종료 신호는 script원래 신호에서 작동 SIGTSTP하고 일시 중지될 수 있을 만큼 오랫동안 재개됩니다. 그런 다음 재개 script명령을 시도하고 fg세션을 종료하십시오.

$ script
Script started, output log file is 'typescript'.
$ while date; do sleep 5; done
Mon, 15 Apr 2024 14:44:42
Mon, 15 Apr 2024 14:44:47

이 시점에서 script데이터가 수신 SIGTSTP되고 내부 프로세스 실행이 중지됩니다. 후속 전송에는 SIGCONT눈에 띄는 차이가 없었습니다 .

전송 SIGINT결과는 다음과 같습니다.

Mon, 15 Apr 2
[1]+  Stopped                 script

그런 다음 명령을 복원하십시오.

$ fg
script

Session terminated, killing shell... ...killed.
Script done.

SIGSTOP제 생각에는 프로세스 내부로 보내는 것이 더 좋습니다 script. 또 다른 예는 다음과 같습니다.

$ script
Script started, output log file is 'typescript'.
$ while date; do sleep 5; done
Mon, 15 Apr 2024 14:48:31
Mon, 15 Apr 2024 14:48:36
Mon, 15 Apr 2024 14:48:41
Mon, 15 Apr 2024 14:48:46    # Here I sent SIGSTOP to the shell running the "while" loop
Mon, 15 Apr 2024 14:49:07
Mon, 15 Apr 2024 14:49:12    # Here I hit Ctrl/C to break the loop

$ exit
Script done.

관련 정보