%EA%B0%80%20%EC%8A%A4%ED%81%AC%EB%A6%BD%ED%8A%B8%20%EB%AA%85%EB%A0%B9%EC%9C%BC%EB%A1%9C%20%EC%8B%9C%EC%9E%91%EB%90%9C%20%EC%8A%A4%ED%81%AC%EB%A6%BD%ED%8A%B8%EC%97%90%20%EB%8C%80%ED%95%B4%20%EC%9E%91%EB%8F%99%ED%95%98%EC%A7%80%20%EC%95%8A%EC%8A%B5%EB%8B%88%EB%8B%A4..png)
참고: stdin 및 stdout을 파일에 기록하는 명령을 script
나타냅니다 .script
script
터미널에서 텍스트 색상을 유지하면서 나중에 검사할 수 있도록 출력을 저장하는 유틸리티를 사용하여 스크립트를 실행하려고 했습니다 .
- Ctrl+ Z( ) 를 사용하여 현재 스크립트를 일시 중지하려고 하면
SIGTSTP
콘솔이 인쇄되고^Z
스크립트가 중지되지 않습니다. - Ctrl그런 다음 +를 시도했습니다 .S
(. 현재 실행 중인 스크립트는 터미널을 해제하지는 않지만 동결(SIGSTOP
)htop
모든 프로세스를 모드로 표시 )합니다. + 는 재개합니다.Z
CtrlQ
이제 왜 그랬는지 헷갈려요
Ctrl+는 S작동하지만 SIGSTOP
SIGTSTP
( Ctrl+ Z)는 작동하지 않습니다.
갇힐 수 있다는 것을 알고 있지만 SIGTSTP
그렇게 할 이유가 없으며 script
의 매뉴얼 페이지에도 이에 대한 내용이 없습니다. 스크립트 인터프리터를 대화형 모드로 강제 설정하려고 했지만 결과가 더 혼란스럽습니다. Ctrl+ Z( )를 실행하면 SIGTSTP
실행 중인 스크립트가 일시 중지되지만 script
스크립트가 완료된 후 종료되어 일시 중지된 모든 하위 프로세스가 종료됩니다.
이러한 상황에서 정상적으로 일시중단을 허용할 수 있는 방법이 있나요? 그리고 무슨 일이 일어났는지 정확히 설명해줄 수 있는 사람이 있나요?
답변1
다른 통과 도구( ssh
, screen
, tmux
등) 와 마찬가지로 script
Ctrl/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.