を実行するとssh user@remote_host tail -f /some/file
、tail -f /some/file
ssh接続が閉じられていてもremote_hostで実行し続けることに気付きました!
したがって、いくつかの接続と切断の後、実行数がtail -f /some/file
増加します。tail -f
SSH接続が閉じられたときに実際に終了する方法は?
を実行するとssh user@remote_host tail -f /some/file
、tail -f /some/file
ssh接続が閉じられていてもremote_hostで実行し続けることに気付きました!
したがって、いくつかの接続と切断の後、実行数がtail -f /some/file
増加します。tail -f
SSH接続が閉じられたときに実際に終了する方法は?
回答:
に
ssh host tail -f file
ssh
クライアントがに接続しsshd
ているサーバhost
のTCP接続を介して。stdoutをパイプにリダイレクトしてsshd
実行tail -f
します。sshd
パイプのもう一方の端から送られてくるものを読み取り、sshdプロトコルにカプセル化してssh
クライアントに送信します。(ではrshd
、tail
stdoutは直接ソケットでしたがsshd
、暗号化を追加し、単一のTCP接続で複数のストリーム(ポート/エージェント/ X11 /トンネルリダイレクト、stderrなど)を多重化できるため、パイプに頼る必要があります)。
CTRL-Cを押すと、SIGINTがssh
クライアントに送信されます。それはssh
死にます。死亡すると、TCP接続は閉じられます。したがって、上host
でもsshd
死にます。tail
は殺されませんが、その標準出力は、もう一方の端にリーダーのないパイプです。そのため、次に標準出力に何かを書き込むときに、SIGPIPEを受け取って死にます。
に:
ssh -t host 'tail -f file'
それは間の通信、代わりにパイプであるということを除いて同じことだsshd
とは、tail
擬似端末を介して行われます。tail
標準出力は、スレーブ疑似端末(等である/dev/pts/12
)と何tail
があるの書き込みread
マスター側(おそらくTTYライン規律によって修飾)によってsshd
とにカプセル化された送信ssh
クライアント。
クライアント側で-t
、ssh
を使用して、端末をraw
モードにします。特に、端末の標準モードと端末の信号処理が無効になります。
それで、あなたは押したときにCtrl+C、代わりに、クライアントの端末回線の規律がにSIGINTを送るssh
だけで送信していること、仕事^C
への接続を介して、文字をsshd
してsshd
いることを書き込み、^C
リモート端末のマスタ側へ。そして、リモート端末の回線制御はに送信SIGINT
しtail
ます。tail
その後sshd
、終了し、接続をssh
終了して閉じ、終了します(ポート転送などでまだビジーでない場合)。
また、を使用すると-t
、ssh
クライアント~.
が停止した場合(たとえばを入力した場合)、接続が閉じられて停止しsshd
ます。その結果、SIGHUPがに送信されtail
ます。
さて、使用に-t
は副作用があることに注意してください。たとえば、デフォルトの端末設定では、\n
文字が変換さ\r\n
れ、リモートシステムに応じてさらに多くのことが発生する可能性があるためstty -opost
、その出力が意図されていない場合は、リモートホストで(出力の後処理を無効にするため)を発行することができますターミナル:
$ ssh localhost 'echo x' | hd
00000000 78 0a |x.|
00000002
$ ssh -t localhost 'echo x' | hd
00000000 78 0d 0a |x..|
00000003
$ ssh -t localhost 'stty -opost; echo x' | hd
00000000 78 0a |x.|
00000002
-t
/ を使用する別の欠点は-tt
、クライアントでstdoutとstderrが区別されないことです。リモートコマンドのstdoutとstderrの両方がssh
クライアントのstdoutに書き込まれます。
$ ssh localhost ls /x | wc -l
ls: cannot access /x: No such file or directory
0
$ ssh -t localhost ls /x | wc -l
1
-t
、ssh
クライアントが死んだ場合(たとえばを入力した場合~.
)」何が~.
再びですか?
~.
は、クライアントを切断するために入力するエスケープシーケンスです。詳細man ssh
を参照してください。
リモート側で端末の割り当てが必要です:
ssh -t user@remote_host tail -f /some/file
あるいは
ssh -tt user@remote_host tail -f /some/file
-t
または-tt
作品。しかし、これの本当の理由はまだ理解できません。たとえば、シェルをリモートで呼び出して接続を閉じると、シェルは終了します。しかし、そうでtail -f
はありません。もちろん、私はすでに-t
オプションについて読んでいますがman ssh
、あまり役に立ちませんでした。私はいくつかのジェネリックを理解していないようです、そしてそれについて読むためにいくつかのドキュメントを提案するか、おそらくあなた自身でそれを説明していただければ幸いです。ありがとう!
sshd
送信しSIGHUP
ます。しかし、誰の端末には、端末の接続ハングアップ...あり得ないではないところ
SIGHUP
他のシグナルについて読みますが、それについてはほとんど何も知りません。
tail -f
ましたがhtop
、開いSIGHUP
て(F9
-> 1
->を押して)送信しEnter
、tail -f
終了しました!だから、その理由は、いくつかの異なるはず...
tail
反応しないということではありませんSIGHUP
。問題は、擬似端末なしでSIGHUP
は「送信されtail
ない」ということです。両方の場合にアタッチstrace
することでそれを見ることができますtail
。