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.