답변:
프로그램의 출력이 버퍼링되므로 연결이 느리면 버퍼가 가득 차면 프로그램이 중지됩니다.
를 사용 screen
하면 연결된 세션에 표시하고 표시하는 데 사용되는 버퍼도 있습니다. 그러나 화면 세션에서 연결 프로그램이 것 없는 경우 중지 screen
캔 원격 터미널 충분히 빨리 업데이트하지. 연결이 끊어졌을 때와 마찬가지로 프로그램은 screens
오버플로 될 때까지 버퍼를 계속 채 웁니다 (가장 오래된 정보를 푸시). 당신이 오는 (그리고 다시 스크롤 할 수있는) 것은 그 버퍼에있는 (여전히)에 달려 있습니다. screen
터미널과 느린 SSH 연결에서 프로그램을 효과적으로 분리합니다.
기본 TCP 연결이 RST 플래그가 있는 패킷을 수신하면 SSH 연결이 조기에 종료 될 수 있습니다 . 한쪽이 패킷 (주기적인 SSH keepalive 프로브 일 수 있음)을 보내지 만 합리적인 시간 내에 TCP 승인을받지 않거나 라우터가 연결이 너무 오래 유휴 상태라고 결정한 경우 또는 ISP는 사악합니다.
유닉스 터미널 모델에서, 터미널 연결이 끊어지면 터미널 드라이버는 쉘에 HUP 신호 를 보내며 , 그 종료로 인해 SIGHUP이 쉘에서 실행중인 프로세스로 전송됩니다.
로부터 유닉스 프로그래머 자주 묻는 질문 , 항목 1.15 :
SIGHUP
"터미널 라인이 끊어졌다"는 것을 의미하는 신호입니다. 부모 프로세스와는 아무런 관련이 없으며 일반적으로 tty 드라이버에 의해 생성되며 포 그라운드 프로세스 그룹으로 전달됩니다.그러나 세션 관리 시스템의 일부로
SIGHUP
프로세스 종료시 정확히 두 가지 경우 가 전송됩니다.
종료되는 프로세스가 터미널 장치에 연결된 세션의 세션 리더 인 경우 해당 터미널 장치
SIGHUP
의 포 그라운드 프로세스 그룹에있는 모든 프로세스로 전송됩니다.프로세스의 죽음이 발생하면 프로세스 그룹은 고아가 될, 그리고 고아 그룹에 하나 개 이상의 프로세스가되어 정지 한 후,
SIGHUP
그리고SIGCONT
고아 그룹의 모든 구성원에게 전송됩니다. 분리 된 프로세스 그룹은 그룹의 프로세스에 동일한 세션의 일부이지만 동일한 프로세스 그룹이 아닌 상위가없는 그룹입니다.
SIGHUP 의 기본 신호 처리기 는 프로세스를 종료하는 것입니다.
Signal Value Action Comment ---------------------------------------------------------------------- SIGHUP 1 Term Hangup detected on controlling terminal or death of controlling process
그러나 프로세스 종료를 피할 수 있습니다.
SIGHUP을 무시하는 신호 핸들러를 삽입 할 수 있습니다. 이를 사용자로 수행하려면의 명령을 래핑하십시오 nohup
. 예를 들면 다음과 같습니다.
nohup make all &
쉘에게 자식 프로세스를 분리하도록 지시 할 수 있습니다. 예를 들어, Bash에는 disown
내장 명령이 있습니다.
make all
CtrlZ
bg disown %1
그런 다음 SIGHUP은 더 이상 아이가 아닌 아이에게 전파되지 않습니다.
sigaction(2)
하거나 새 세션에 참여하도록 선택할 수 있습니다 ( setsid(2)
).screen
또는 tmux
의사 TTY를 할당하는 경우 SSH 연결 죽는 SIGHUP를 수신하지 않는 쉘 세션을 실행하려면. SIGHUP은 SSH 세션에서 screen / tmux 세션으로 릴레이되지 않습니다.또한 신뢰할 수없는 SSH 연결을 처리하는 다른 방법은 Mosh 프로토콜을 대신 사용하는 것입니다. Mosh는 UDP를 통해 실행되므로 재설정 될 위험이있는 TCP 연결이 없습니다.
예, SSH를 통해 실행되는 프로그램은 출력 위치에 따라 다릅니다. 연결 속도가 느리면 출력을 어딘가에 버퍼링해야하며 버퍼를 무한정 할 수 없으므로 프로그램이 채워지면 차단해야합니다.
출력이 반드시 터미널로 갈 필요는 없습니다.
ssh user@somewhere "cat file.txt" > file.txt
실제로 파일을 복사합니다. 이것이 작동하려면 cat의 출력 속도가 연결 속도와 일치해야합니다. 중간에서 출력의 일부를 잃는 것은 용납 될 수 없음이 분명합니다.
화면은 터미널처럼 작동하는 상황을 변경하고 "터미널 창에"표시해야 할 내용을 저장합니다 (스크롤 백 포함). 프로그램이 출력하는 모든 것을 기억할 필요는 없으며 "창"과 스크롤 백에 맞는 부분 만 기억해야합니다. 기본적으로 화면은 연결이 느릴 때까지 기다리지 만 (프로그램 차단) "비 차단 켜기"를 설정하여 연결이 끊어 졌음을 감지하도록 구성 할 수 있습니다.
매뉴얼 페이지에서 :
비 블록 [on | off | numsecs]
출력 승인을 중단하는 사용자 인터페이스 (디스플레이)를 처리하는 방법을 화면에 알려주십시오. 사용자가 ^ S를 누르거나 TCP / 모뎀 연결이 끊어 지지만 끊기가 수신되지 않는 경우 발생할 수 있습니다. 비 블록이 꺼져 있으면 (이것이 기본값 임) 화면은 출력이 다시 시작될 때까지 기다립니다. 비 차단이 켜져 있으면 시간 초과에 도달 할 때까지 화면이 대기합니다 (켜짐은 1로 처리됨). 디스플레이에 여전히 문자가 수신되지 않으면 화면이 "차단"된 것으로 간주하여 문자 전송을 중지합니다. 문자를 받아들이 기 위해 다시 시작하면 화면이 표시를 차단 해제하고 업데이트 된 창 내용을 다시 표시합니다.
연결이 느리게 연결되는 것과 다릅니다. 일반 SSH는 자동으로 복구 할 수 없으므로 프로그램에 SIGHUP이 수신됩니다. 반면에, 화면은 연결 해제를 감지하고 화면이 다시 연결될 때까지 분리하고 로컬 버퍼링으로 돌아갑니다. 실행중인 프로그램 은 차단 되지 않습니다 .
(설정 nonblock 1
당신의 것은 .screenrc
당신이 지속적으로 동시에 네트워크에 이야기해야한다 여전히 출력을 생성하지만 것 irssi 뭔가를 실행하는 경우 중요합니다. 매우 짜증나는 IRC에서 분리하기로 이어질 것이다 차단 ...)