ssh 세션에서 실행되는 프로그램은 연결에 의존합니까?


29

ssh 세션에서 실행되는 프로그램이 클라이언트 연결에 의존합니까? 예를 들어 연결이 실제로 느린 경우. 그러면 화면에 물건이 인쇄 될 때까지 적극적으로 대기합니까?

연결에 의존한다면 화면 이나 byobu 에서도 발생 합니까? 이들을 사용하면 호스트에서 연결을 끊은 후에도 프로그램이 계속 실행됩니다.


참고 : 나는 다음과 같은 관련 질문 만 찾았습니다.


1
연결이 끊어지면 세션 시간이 초과 될 때까지 (인쇄 작업에 걸리지 않는 한) 프로그램이 계속 실행되지만 세션이 종료되면 프로그램이 정상적으로 종료됩니다.
Sebb

답변:


26

프로그램의 출력이 버퍼링되므로 연결이 느리면 버퍼가 가득 차면 프로그램이 중지됩니다.

를 사용 screen하면 연결된 세션에 표시하고 표시하는 데 사용되는 버퍼도 있습니다. 그러나 화면 세션에서 연결 프로그램이 것 없는 경우 중지 screen캔 원격 터미널 충분히 빨리 업데이트하지. 연결이 끊어졌을 때와 마찬가지로 프로그램은 screens오버플로 될 때까지 버퍼를 계속 채 웁니다 (가장 오래된 정보를 푸시). 당신이 오는 (그리고 다시 스크롤 할 수있는) 것은 그 버퍼에있는 (여전히)에 달려 있습니다. screen터미널과 느린 SSH 연결에서 프로그램을 효과적으로 분리합니다.


9

기본 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은 더 이상 아이가 아닌 아이에게 전파되지 않습니다.

  • 데몬 과 같은 일부 프로그램 은 위의 메커니즘을 자동으로 사용합니다. 프로그램은을 사용하여 대체 SIGHUP 핸들러를 설치 sigaction(2)하거나 새 세션에 참여하도록 선택할 수 있습니다 ( setsid(2)).
  • 당신은 실행할 수 있습니다 screen또는 tmux의사 TTY를 할당하는 경우 SSH 연결 죽는 SIGHUP를 수신하지 않는 쉘 세션을 실행하려면. SIGHUP은 SSH 세션에서 screen / tmux 세션으로 릴레이되지 않습니다.

또한 신뢰할 수없는 SSH 연결을 처리하는 다른 방법은 Mosh 프로토콜을 대신 사용하는 것입니다. Mosh는 UDP를 통해 실행되므로 재설정 될 위험이있는 TCP 연결이 없습니다.



1

예, SSH를 통해 실행되는 프로그램은 출력 위치에 따라 다릅니다. 연결 속도가 느리면 출력을 어딘가에 버퍼링해야하며 버퍼를 무한정 할 수 없으므로 프로그램이 채워지면 차단해야합니다.

출력이 반드시 터미널로 갈 필요는 없습니다.

ssh user@somewhere "cat file.txt" > file.txt

실제로 파일을 복사합니다. 이것이 작동하려면 cat의 출력 속도가 연결 속도와 일치해야합니다. 중간에서 출력의 일부를 잃는 것은 용납 될 수 없음이 분명합니다.

화면은 터미널처럼 작동하는 상황을 변경하고 "터미널 창에"표시해야 할 내용을 저장합니다 (스크롤 백 포함). 프로그램이 출력하는 모든 것을 기억할 필요는 없으며 "창"과 스크롤 백에 맞는 부분 만 기억해야합니다. 기본적으로 화면은 연결이 느릴 때까지 기다리지 만 (프로그램 차단) "비 차단 켜기"를 설정하여 연결이 끊어 졌음을 감지하도록 구성 할 수 있습니다.

매뉴얼 페이지에서 :

비 블록 [on | off | numsecs]

출력 승인을 중단하는 사용자 인터페이스 (디스플레이)를 처리하는 방법을 화면에 알려주십시오. 사용자가 ^ S를 누르거나 TCP / 모뎀 연결이 끊어 지지만 끊기가 수신되지 않는 경우 발생할 수 있습니다. 비 블록이 꺼져 있으면 (이것이 기본값 임) 화면은 출력이 다시 시작될 때까지 기다립니다. 비 차단이 켜져 있으면 시간 초과에 도달 할 때까지 화면이 대기합니다 (켜짐은 1로 처리됨). 디스플레이에 여전히 문자가 수신되지 않으면 화면이 "차단"된 것으로 간주하여 문자 전송을 중지합니다. 문자를 받아들이 기 위해 다시 시작하면 화면이 표시를 차단 해제하고 업데이트 된 창 내용을 다시 표시합니다.

연결이 느리게 연결되는 것과 다릅니다. 일반 SSH는 자동으로 복구 할 수 없으므로 프로그램에 SIGHUP이 수신됩니다. 반면에, 화면은 연결 해제를 감지하고 화면이 다시 연결될 때까지 분리하고 로컬 버퍼링으로 돌아갑니다. 실행중인 프로그램 은 차단 되지 않습니다 .

(설정 nonblock 1당신의 것은 .screenrc당신이 지속적으로 동시에 네트워크에 이야기해야한다 여전히 출력을 생성하지만 것 irssi 뭔가를 실행하는 경우 중요합니다. 매우 짜증나는 IRC에서 분리하기로 이어질 것이다 차단 ...)

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.