문제
SSH를 통해 많은 정보를 출력하는 명령을 실행합니다. 예를 들어, 수백만 번 실행되는 루프 내에 디버그 정보를 어리석게 추가하거나 그냥 실행합니다 cat /dev/urandom
.
터미널에는 정보가 넘쳐납니다.
최대한 빨리 명령을 종료하고 프로그램을 수정하고 싶습니다. 나는 그것이 무엇을 인쇄하든 상관하지 않습니다. 이제 문제는 Ctrl+ CASAP를 누르는 것입니다(위의 예에서는 명령을 실행한 직후에 눌렀습니다).필요하지도 않은 모든 정보를 인쇄하는 데는 여전히 시간이 걸립니다..
내가 시도한 것
Ctrl나는 +를 너무 세게 눌러 C터미널이 마침내 따라잡았을 때 재미있는 결과를 얻었습니다.
OUTPUT HERE^C
rr-@burza:~/xor$ ^C
rr-@burza:~/xor$ ^C
rr-@burza:~/xor$ ^C
^C^C
^C^C^C^C^C^C^C^C^C^C^C
^C^C^C^C^C^C^C^C^C^C
^C^C^C^C^C^C^C^C^C^C^C^C^C^C^C^C
^C^C^C^C^C^C^C
^C^C^C^C^C^C^C^C^C^C^C^C^C^C^C^C^C^C^C^C^C^C^C^C
^C^C^C^C^C^C^C^C^C^C^C^C^C^C^C^C
^C^C^C^C^C^C^C^C^C^C^C^C^C
rr-@burza:~/xor$ ^C
rr-@burza:~/xor$ ^C
rr-@burza:~/xor$ ^C
rr-@burza:~/xor$ ^C
rr-@burza:~/xor$ ^C
rr-@burza:~/xor$ ^C
rr-@burza:~/xor$ ^C
rr-@burza:~/xor$ ^C
rr-@burza:~/xor$ ^C
나는 또한 Ctrl+ 에 대해 읽었습니다 S.터미널에 "출력 중지, 따라잡아야 합니다"라고 알리는 데 사용됩니다.그러나 분명히 그것은 아무것도 하지 않습니다.
기타 세부정보
나는 내가 실행하는 프로그램이 그렇게 끝날 수 있다는 것을 기억하지 못하더라도 어떤 상황에서도 나 자신을 구할 수 있도록 내가 실행하는 명령을 변경하지 않고 싶습니다.
내 SSH 클라이언트는 CYGWIN_NT-6.1-WOW64 luna 1.7.30(0.272/5/3) 2014-05-23 10:36 i686 Cygwin
터미널 유형이 로 설정된 MinTTY의 Cygwin( ) 에서 실행됩니다 xterm-256color
.
SSH 서버는 Debian( Linux burza 3.2.0-4-686-pae #1 SMP Debian 3.2.51-1 i686 i686 i686 GNU/Linux
)에서 실행됩니다.
답변1
나는 일반적으로 키를 사용하는 대신 less
출력을 종료할 수 있도록 출력을 실행합니다 .less
q
$ cmd | less
예
$ cat /dev/urandom | less
q+를 누르면 Enter종료되고 일반 터미널로 돌아가서 깔끔하고 깨끗하게 유지됩니다.
왜 그런 일이 발생합니까?
발생한 문제는 디스플레이 출력과 함께 대기 중인 버퍼(STDOUT용)가 있다는 것입니다. 이러한 버퍼는 너무 빨리 채워지므로 중지할 만큼 빠르게 중단할 수 없습니다.
이 효과를 비활성화/제한하려면 STDOUT 버퍼링을 비활성화하여 를 사용하여 반응성을 좀 더 높일 수 있지만 stdbuf
원하는 방식으로 작업하려면 이러한 설정을 사용해야 할 수도 있습니다. STDOUT 버퍼링을 해제하려면 다음 명령을 사용할 수 있습니다.
$ stdbuf -o0 <cmd>
stdbuf
원하는 옵션에 대한 자세한 내용은 매뉴얼 페이지에서 확인하세요.
If MODE is 'L' the corresponding stream will be line buffered. This
option is invalid with standard input.
If MODE is '0' the corresponding stream will be unbuffered.
Otherwise MODE is a number which may be followed by one of the
following: KB 1000, K 1024, MB 1000*1000, M 1024*1024, and so
on for G, T, P, E, Z, Y. In this case the corresponding stream will be
fully buffered with the buffer size set to MODE
bytes.
버퍼링이 어떻게 작동하는지에 대한 좋은 배경 지식을 얻으려면 다음과 같은 제목의 Pixel Beat 기사를 살펴보는 것이 좋습니다.표준 스트림의 버퍼링. 심지어 멋진 사진도 포함되어 있습니다.
참고자료
답변2
해당 출력 중 일부는 버퍼링됩니다. 실행 중인 프로그램을 중단하는 원격 끝으로 Ctrl+를 보냅니다 . C프로그램이 존재하고 쉘은 프롬프트를 다시 표시하기 위해 문자를 보냅니다. 프롬프트가 표시되기 전에 먼저 버퍼링되어 이미 진행 중인 모든 데이터가 화면에 표시됩니다.
당신이 요구하는 것은 프로그램이 중지되고 전송 중인 데이터가 어떻게든 사라지는 것입니다. 이미 진행 중이기 때문에 그런 일은 일어날 수 없습니다.
이 데이터가 표시되지 않도록 할 수 있는 유일한 방법은 터미널을 종료한 다음 리모컨에 다시 연결하는 것입니다. 하지만 이는 버퍼링된 데이터가 표시될 때까지 기다리는 것보다 훨씬 더 많은 노력이 필요할 수 있습니다.
답변3
버퍼링에는 여러 수준이 있습니다. Ctrl+ 를 누르면 C프로그램이 터미널로 데이터를 내보내는 것이 중지됩니다. 이는 터미널 에뮬레이터가 아직 표시하지 않은 데이터에는 영향을 미치지 않습니다.
매우 빠른 속도로 데이터를 표시하면 터미널이 따라잡지 못하고 지연됩니다. 이것이 바로 여기서 일어나는 일입니다. 텍스트를 표시하는 것은 이러한 난수를 생성하는 것보다 훨씬 더 비쌉니다. 예, 비트맵 글꼴을 사용하더라도 암호화 품질의 난수를 생성하는 것은 그에 비해 매우 저렴합니다. (방금 내 컴퓨터에서 시도했는데 X 프로세스가 CPU를 포화시켜 xterm
몇 %를 차지했고 cat
(난수 생성이 고려되는) 거의 1%에 도달했습니다. 그리고 그것은 비트맵 글꼴을 사용합니다.)
지금 이 작업을 중지하려면 터미널 에뮬레이터를 종료하세요. 그렇게 하고 싶지 않다면 최소한 창을 최소화하십시오. 지능형 터미널 에뮬레이터(예: xterm)는 창을 매핑하지 않으므로 X CPU 시간이 절약되므로 가비지 표시가 더 빨리 완료됩니다. X 서버는 우선순위가 높으므로 xterm이 백그라운드에서 데이터를 처리하는 동안 시스템의 응답성에 큰 차이를 만듭니다.
이 모든 작업이 원격 셸에서 진행되면 생성된 데이터가 cat
먼저 SSH 연결을 통과해야 하기 때문에 지연이 더욱 심해집니다. Ctrl+를 눌러도 CSSH 연결을 거쳐야 합니다. 다소 높은 우선순위를 가지지만(대역 외로 전송됨) 더 많은 출력이 누적되는 데 여전히 시간이 걸립니다. SSH 연결을 닫지 않고는 전송 중인 데이터를 억제할 수 있는 방법이 없습니다( Enter다음을 눌러 수행할 수 있음 ~.
).
답변4
나는 같은 문제가 있었고 여기에 대한 답변이 만족스럽지 않아서 더 깊이 파고 들었습니다. 다른 사람들은 이미 귀하의 명령이 ssh가 취할 수 있는 것보다 더 빠르게 데이터를 출력하므로 데이터 버퍼와 버퍼를 중지할 수 없다고 언급했습니다.
이 문제를 해결하려면 명령 출력을 SSH 세션이 취할 수 있는 최대 속도로 조절하여 버퍼링을 방지하세요. 이 작업을 수행하는 명령이 이미 존재합니다.
설정하고 먼저 세션 최대 속도를 알아보세요.
# Get transfer <TIME> of a large file (>10MB preferable)
/usr/bin/time -f "%e" cat <FILENAME>
# Get file <SIZE> in bytes
stat --printf="%s\n" <FILENAME>
# Calculate <RATE>
echo "<SIZE> / <TIME>" | bc
마지막으로 그에 따라 실제 명령을 제한하십시오.
<YOUR_COMMAND> | pv -qL <RATE>
예:
/usr/bin/time -f "%e" cat large_reference_file.txt
31.26
stat --printf="%s\n" cat large_reference_file.txt
17302734
echo "17302734 / 31.26" | bc
553510
# Throttle my command to 553510B/s
cat some_other_file.txt | pv -qL 553510
때때로 연결 속도가 약간 떨어지는 경우 RATE를 약간 낮추는 것이 좋습니다. 그것이 떨어지면 동작은 응답하지 않는 Ctrl-C 문제로 돌아갑니다.
선택적 제한 고양이 별칭:
# bash
alias tcat='tcat(){ cat $@ | pv -qL 400k ; }; tcat'
# tcsh
alias tcat 'cat \!* | pv -qL 400k'
# usage: tcat <FILENAME>
이제 ctrl-c는 예상대로 작동하며 버퍼링된 내용이 거의 없기 때문에 출력을 즉시 종료합니다.