接続が閉じたときに「tail -f」呼び出しをリモートで終了する方法は?

接続が閉じたときに「tail -f」呼び出しをリモートで終了する方法は?

ssh user@remote_host tail -f /some/fileただ実行すると、tail -f /some/file接続が閉じてもSSH接続がRemote_hostで実行され続けることがわかりました!

したがって、複数回接続して切断した後は、実行回数tail -f /some/fileが増えます。tail -fSSH接続が閉じたときに実際にシャットダウンする方法は?

ベストアンサー1

存在する

ssh host tail -f file

クライアントはTCP接続を介してサーバーsshに接続します。sshd実行すると、標準出力はパイプにリダイレクトされます。パイプのもう一方の端からコンテンツを読み取り、sshdプロトコルにカプセル化してクライアントに送信します。 (使用する場合、stdoutは直接ソケットになりますが、暗号化が追加され、単一のTCP接続(ポート/プロキシ/X11/トンネルリダイレクト、stderr)から複数のストリームを多重化する機能が追加された場合は、パイプを使用する必要があります。)hostsshdtail -fsshdsshrshdtailsshd

CTRL-C を押すと、SIGINT がsshクライアントに送信されます。それはssh死につながる可能性があります。接続が切断されると、TCP接続は閉じます。したがって、オンhostsshd死にます。tail終了しませんでしたが、標準出力はもう一方の端にリーダーを持たないパイプです。したがって、次回はstdoutに書き込むとSIGPIPEを受信して​​終了します(最新バージョンのGNUtailモニターはそのstdoutが壊れたパイプになったことに気づき、その場合はすぐに終了します)。この関連質問への回答破損したパイプを検出する方法を学びます。)

存在する:

ssh -t host 'tail -f file'

との間の通信がパイプを経由せずに擬似sshd端末tailを介して行われることを除いて、2つは同じです。tailstdoutはスレーブ擬似端末(例/dev/pts/12:)であり、マスターへのすべての書き込みtail(tty行規則によって変更することができます)はカプセル化され、クライアントに送信されます。readsshdssh

クライアント側では、を使用して-t端末sshrawモードに切り替えます。特に、端末仕様モードと端末信号処理を無効にします。

したがって、キーを押すと、クライアントCtrl+CのターミナルラインルールはSIGINTをジョブに送信せず、代わりに接続を介してsshリモート^Cターミナルのマスター側に文字を送信およびsshd書き込みますsshd^Cリモート端末の回線規則はSIGINTをに送信しますtailtailその後、sshd接続は終了し、終了し、ssh閉じて終了します(まだポート転送などで使用されていない場合)。

また、を使用している場合、クライアントがシャットダウンすると-tsshたとえば、と入力した場合~.)、接続は閉じて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つの欠点は、-ttstdoutと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

おすすめ記事