ssh user@remote_host tail -f /some/file
ただ実行すると、tail -f /some/file
接続が閉じてもSSH接続がRemote_hostで実行され続けることがわかりました!
したがって、複数回接続して切断した後は、実行回数tail -f /some/file
が増えます。tail -f
SSH接続が閉じたときに実際にシャットダウンする方法は?
答え1
存在する
ssh host tail -f file
クライアントはTCP接続を介してサーバーssh
に接続します。sshd
実行すると、標準出力はパイプにリダイレクトされます。パイプのもう一方の端からコンテンツを読み取り、sshdプロトコルにカプセル化してクライアントに送信します。 (使用する場合、stdoutは直接ソケットになりますが、暗号化が追加され、単一のTCP接続(ポート/プロキシ/X11/トンネルリダイレクト、stderr)から複数のストリームを多重化する機能が追加された場合は、パイプを使用する必要があります。)host
sshd
tail -f
sshd
ssh
rshd
tail
sshd
CTRL-C を押すと、SIGINT がssh
クライアントに送信されます。それはssh
死につながる可能性があります。接続が切断されると、TCP接続は閉じます。したがって、オンhost
もsshd
死にます。tail
終了しませんでしたが、標準出力はもう一方の端にリーダーを持たないパイプです。したがって、次回はstdoutに書き込むとSIGPIPEを受信して終了します(最新バージョンのGNUtail
モニターはそのstdoutが壊れたパイプになったことに気づき、その場合はすぐに終了します)。この関連質問への回答破損したパイプを検出する方法を学びます。)
存在する:
ssh -t host 'tail -f file'
との間の通信がパイプを経由せずに擬似sshd
端末tail
を介して行われることを除いて、2つは同じです。tail
stdoutはスレーブ擬似端末(例/dev/pts/12
:)であり、マスターへのすべての書き込みtail
(tty行規則によって変更することができます)はカプセル化され、クライアントに送信されます。read
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
/使用のもう1つの欠点は、-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
答え2
リモート側に端末を割り当てる必要があります。
ssh -t user@remote_host tail -f /some/file
でも
ssh -tt user@remote_host tail -f /some/file