Write failed: Broken pipeによる切断を防ぐ

サーバにssh接続したあと切断せずに捨ておくとWrite failed: Broken pipeというメッセージが表示されてセッションが切れていることがあった。再度、接続し直すのは手間であるからssh接続の設定を探って切断されぬようにするものである。例えばこういう具合である。

$ vi ~/.ssh/config
Host *
  ServerAliveInterval 30
  ServerAliveCountMax 10

ServerAliveIntervalはサーバからデータが送られてこなくなってから何秒後に応答を求めるメッセージを投げつけるかを定める。デフォルトではそもメッセージを送り出さない模様である。tcpdumpで通信を覗き見ると、PSHフラグを立てたパケットをサーバへ送りつけているようであった。

$ sudo tcpdump -n -i ens3 port 22
(snip)
22:50:30.488309 IP 192.0.2.1.55773 > 153.121.51.164.22: Flags [P.], seq 72:108, ack 109, win 305, options [nop,nop,TS val 1047147664 ecr 177098205], length 36
22:50:30.488696 IP 153.121.51.164.22 > 192.0.2.1.55773: Flags [P.], seq 109:145, ack 108, win 309, options [nop,nop,TS val 177105717 ecr 1047147664], length 36
22:50:30.506156 IP 192.0.2.1.55773 > 153.121.51.164.22: Flags [.], ack 145, win 305, options [nop,nop,TS val 1047147668 ecr 177105717], length 0

22:51:00.536025 IP 192.0.2.1.55773 > 153.121.51.164.22: Flags [P.], seq 108:144, ack 145, win 305, options [nop,nop,TS val 1047155176 ecr 177105717], length 36
22:51:00.536334 IP 153.121.51.164.22 > 192.0.2.1.55773: Flags [P.], seq 145:181, ack 144, win 309, options [nop,nop,TS val 177113229 ecr 1047155176], length 36
22:51:00.554444 IP 192.0.2.1.55773 > 153.121.51.164.22: Flags [.], ack 181, win 305, options [nop,nop,TS val 1047155180 ecr 177113229], length 0

ServerAliveCountMaxはサーバからの反応が無くなった際、応答を呼びかけるメッセージの送出回数定め、これを超えたら切断してセッションを終える模様である。デフォルトでは3回という取り決めであった。したがってサーバからの応答が失われてから概ね

ServerAliveInterval ✕ ServerAliveCountMax

秒経過するとTimeout, server *** not responding.というメッセージと共に切断される。

図1. ServerAliveInterval 5, ServerAliveCountMax 1にセットした場合の挙動

コメントする

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください