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

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

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

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

  • Ctrl+ Z( ) 를 사용하여 현재 스크립트를 일시 중지하려고 하면 SIGTSTP콘솔이 인쇄되고 ^Z스크립트가 중지되지 않습니다.
  • Ctrl그런 다음 +를 시도했습니다 .S ( SIGSTOP). 현재 실행 중인 스크립트는 터미널을 해제하지는 않지만  동결( htop모든 프로세스를 모드로 표시 )합니다. + 는 재개합니다.ZCtrlQ

이제 왜 그랬는지 헷갈려요SIGSTOP Ctrl+는 S작동하지만 SIGTSTP( Ctrl+ Z)는 작동하지 않습니다.

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

이러한 상황에서 정상적으로 일시중단을 허용할 수 있는 방법이 있나요? 그리고 무슨 일이 일어났는지 정확히 설명해줄 수 있는 사람이 있나요?

답변1

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

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

$ 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.

관련 정보