프로그램은 연결에 따라 SSH 세션에서 실행됩니까?

프로그램은 연결에 따라 SSH 세션에서 실행됩니까?

SSH 세션에서 실행되는 프로그램은 클라이언트에 대한 연결에 의존합니까?예를 들어 연결이 매우 느린 경우입니다. 그러면 화면에 무언가가 인쇄될 때까지 적극적으로 기다릴까요?

연결에 따라 달라지는 경우에도 발생합니까?화면또는화면예를 들어? 이로 인해 호스트와의 연결이 끊어진 후에도 프로그램은 계속 실행됩니다.


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

답변1

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

를 사용하는 경우 screen연결에 대한 세션을 표시하려고 시도하기 위한 버퍼도 있습니다. 하지만 스크린 세션에 연결된 프로그램은아니요screen원격 터미널을 충분히 빠르게 업데이트할 수 없으면 중지하세요. 연결이 끊어졌을 때와 마찬가지로 프로그램은 screens오버플로될 때까지(가장 오래된 정보를 밀어냄) 버퍼를 계속 채웁니다. 표시되는 내용(그리고 다시 스크롤할 수 있는 내용)은 해당 버퍼에 있는 내용에 따라 달라집니다. screen프로그램을 터미널(및 느린 SSH 연결)에서 효과적으로 분리합니다.

답변2

기본 TCP 연결이 다음과 같은 패킷을 수신하는 경우 SSH 연결이 조기에 종료될 수 있습니다.빠른 회복 시간배너. 한쪽에서 패킷(일반적인 SSH Keepalive 프로브 등)을 보냈지만 합리적인 시간 내에 TCP 승인을 받지 못한 경우, 라우터는 연결이 너무 오랫동안 유휴 상태였다고 판단하거나 ISP가 단지 연결을 유지하는 중이라고 판단합니다. 극악한.

Unix 터미널 모델에서는 터미널 연결이 끊어지면 터미널 드라이버가HUP 신호종료하면 SIGHUP이 셸에서 실행 중인 프로세스로 전송됩니다.

~에서Unix 프로그래머를 위한 FAQ, 항목 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)).
  • SSH 연결이 끊어졌을 때 SIGHUP을 수신하지 않는 셸로 세션을 실행하기 위해 의사 TTY를 할당하는 screen또는 를 실행할 수 있습니다 . tmuxSIGHUP은 SSH 세션에서 screen/tmux 세션으로 릴레이되지 않습니다.

그런데 신뢰할 수 없는 SSH 연결을 처리하는 또 다른 방법은 다음을 사용하는 것입니다.모쉬대신 합의. Mosh는 UDP를 통해 실행되므로 재설정될 위험이 있는 TCP 연결이 없습니다.

답변3

예, SSH를 통해 프로그램을 실행하는 것은 출력이 어딘가로 가는지에 따라 달라집니다. 연결이 느린 경우 출력을 어딘가에 버퍼링해야 하며 버퍼는 무한할 수 없으므로 버퍼가 가득 차면 프로그램을 차단해야 합니다.

출력이 반드시 터미널로 전송될 필요는 없습니다. 다음과 같은 명령을 실행해 보세요.

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

그러면 실제로 파일이 복사됩니다. 이를 위해서는 cat의 출력 속도가 연결의 출력 속도와 일치해야 합니다. 분명히 중간에서 출력의 일부를 잃는 것은 허용되지 않습니다.

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

매뉴얼 페이지에서:

비차단[on|off|numsecs]

출력 승인을 중지하는 사용자 인터페이스(디스플레이)를 처리하는 방법을 화면에 알려줍니다. 이는 사용자가 ^S를 누르거나 끊기 신호를 받지 않고 TCP/모뎀 연결이 끊어진 경우 발생할 수 있습니다. 비차단이 꺼진 경우(기본값) 화면은 모니터가 출력을 승인하기 위해 다시 시작할 때까지 기다립니다. 비차단 방식으로 열리면 화면은 시간 초과에 도달할 때까지 기다립니다(열림은 1초로 간주됩니다). 디스플레이가 여전히 문자를 수신하지 못하면 화면은 이를 "차단"한 것으로 간주하고 문자 전송을 중단합니다. 특정 시점에 문자를 허용하기 위해 재부팅하면 화면이 잠금 해제되고 업데이트된 창 내용이 다시 표시됩니다.

연결 끊김은 느린 연결과 다릅니다. 일반 SSH는 자동으로 재개할 수 없으므로 프로그램이 SIGHUP을 받게 됩니다. 반면에 화면은 연결 끊김을 감지하고 분리된 후 화면이 다시 연결될 때까지 로컬 버퍼링으로 돌아갑니다. 이것은 것이다아니요실행 중인 프로그램을 차단합니다.

( 계속해서 출력을 생성하지만 동시에 네트워크와 통신해야 하는 irssi와 같은 것을 실행하는 경우nonblock 1 이는 설정에서 중요합니다. 차단하면 IRC와의 연결이 끊어질 수 있어 매우 짜증납니다.... ....).screenrc

관련 정보