プログラムは接続に応じて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ただし、セッション管理システムの一部としてプロセスが終了したときに送信される状況は2つあります。

  • 死亡プロセスが端末デバイスに接続されているセッションのセッションリーダーである場合、SIGHUPその端末デバイスのフォアグラウンドプロセスグループ内のすべてのプロセスに送信されます。

  • プロセスの終了によってプロセスグループが孤児になり、孤児グループ内の1つ以上のプロセスが削除された場合停止、孤児グループのすべてのメンバーに送信されますSIGHUPSIGCONT(孤児プロセスグループは、グループ内のどのプロセスも同じセッションに属しますが、同じプロセスグループではなく親プロセスを持たないグループです。)

これSIGHUPの基本信号ハンドラプロセスを終了することです。

Signal     Value     Action   Comment
----------------------------------------------------------------------
SIGHUP        1       Term    Hangup detected on controlling terminal
                              or death of controlling process

ただし、プロセスの終了は避けられます。

  • SIGHUPを無視するシグナルハンドラを挿入できます。ユーザーとしてこれを行うには、次のコマンドを含めます。nohup。たとえば、

    nohup make all &
    
  • シェルに子プロセスを分離するように指示できます。たとえば、Bashdisown組み込みコマンド:

    make all
    

    CtrlZ

    bg
    disown %1
    

    これにより、SIGHUPは子(もはや子ではない)に伝播されません。

  • 一部のプログラムは特に悪魔、上記のメカニズムは自動的に使用されます。プログラムは代替SIGHUPハンドラーをインストールできます(使用)。sigaction(2))または新しいセッションに参加することを選択できます(setsid(2))。
  • SSH接続が失われたときにSIGHUPを受信しないシェルでセッションを実行するために疑似TTYを割り当てるか、またはscreen実行できます。tmuxSIGHUPはSSHセッションからscreen / tmuxセッションに中継されません。

しかし、信頼できないSSH接続を処理するもう1つの方法は、次の方法を使用することです。モシュ代わりに合意。 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

関連情報