참고: stdin 및 stdout을 파일에 기록하는 명령을 script
나타냅니다 .script
script
이 유틸리티를 사용하여 터미널의 텍스트 색상을 유지하면서 나중에 검사할 수 있도록 출력을 저장하는 스크립트를 실행하려고 합니다 .
- CtrlZ+ () 를 사용하여 현재 스크립트를 일시 중지하려고 하면
SIGTSTP
콘솔이 인쇄되고^Z
스크립트가 중지되지 않습니다. - Ctrl그런 다음 +를 시도했습니다 .S
(. 현재 실행 중인 스크립트는 정지되지만(SIGSTOP
)htop
모든 프로세스를Z
모달로 표시) 터미널을 해제하지는 않습니다. Ctrl+ Q실제로 그들을 회복시키십시오.
지금은 왜인지 혼란스럽습니다
Ctrl+ S는 유효하지만 SIGSTOP
SIGTSTP
( Ctrl+ Z)는 유효하지 않습니다.
막힐 가능성이 있다는 것을 알고 있지만 그렇게 할 이유가 없으며 SIGTSTP
매뉴얼 페이지에도 이에 대한 내용이 없습니다. script
나는 스크립트 인터프리터를 대화형 모드로 강제 전환하려고 시도했지만 결과는 나를 더욱 혼란스럽게 만들었습니다. Ctrl+ Z( )를 실행하면 SIGTSTP
실행 중인 스크립트가 정지되지만 script
스크립트가 완료된 후 종료되어 정지된 하위 프로세스가 모두 종료됨을 나타냅니다.
이런 상황에서 우아하게 버틸 수 있는 방법이 있나요? 또한, 무슨 일이 일어나고 있는지 정확히 설명할 수 있는 사람이 있나요?
답변1
다른 통과 도구( ssh
, 등) 와 마찬가지로 Ctrl/Z와 같은 문자가 더 이상 인터럽트 screen
를 생성하지 않도록 호출 터미널을 원시 모드로 전환합니다. 그런 다음 이러한 문자를 전달하고 내부 터미널 장치는 이를 "정상적으로" 처리하여 예상되는 신호를 생성합니다. 모든 프로세스는 캡처를 선택할 수 있지만 캡처할 수는 없습니다 .tmux
script
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.