rsyncのバージョンをあげたらrsync経由の同期のバッチが動かなくなった件 | A Day In The Boy's Life

A Day In The Boy's Life

とあるエンジニアのとある1日のつぶやき。

利用しているRedHat5の環境にて、yumのアップデートをかけたらrsyncコマンドがメジャーバージョンアップしたらしく、rsyncを利用しているコンテンツの同期バッチが動かなくなってしまいました。

今までのrsyncコマンドのバージョンはrsync-2.6.8でしたが、今回からrsync-3.0.6が提供されており、大きくバージョンが違ってきています。

そのバージョンの違いによる問題点と対処方法のまとめを書いてみます。



rsync2系と3系のバージョンによるホスト名の指定方法の仕様の違い


今までrsync2系のバージョンで動作していたコマンドが、rsync3系で動作しなくなった原因は、同期先のホストの指定方法の仕様が変わったからです。


今までだと、


$ rsync -a -e ssh hoge1/ remote-server:/tmp/hoge2/

で動いていたものが3.0.6のバージョンでは動かなくなっています。

対処としては、ホスト名の前にユーザー名をきちんと指定する必要があります。


$ rsync -a -e ssh hoge1/ foo@remote-server:/tmp/hoge2/

ユーザー名を指定せずに、ホスト名だけで実行してみると


usage: ssh [-1246AaCfgkMNnqsTtVvXxY] [-b bind_address] [-c cipher_spec]
           [-D [bind_address:]port] [-e escape_char] [-F configfile]
           [-i identity_file] [-L [bind_address:]port:host:hostport]
           [-l login_name] [-m mac_spec] [-O ctl_cmd] [-o option] [-p port]
           [-R [bind_address:]port:host:hostport] [-S ctl_path]
           [-w tunnel:tunnel] [user@]hostname [command]
rsync: connection unexpectedly closed (0 bytes received so far) [sender]
rsync error: unexplained error (code 255) at io.c(600) [sender=3.0.6]

ってエラーメッセージが表示されます。

予期せぬエラーって出るので何なんだろうと焦りましたが。

(ユーザー名ちゃんと指定しろってメッセージぐらい出してくれても)


この仕様の変更は、RedHatのBugzilla にも取り上げられていて、同じように動作しなくなったって報告が多数上がっています。

まぁ、私もそうなんですがrsyncを使って同期しているプログラムを全部修正する必要が出てきますので、結構影響はでかいですよね。


そういったプログラムやCronで直にrsyncのコマンドを使って同期を取っているような環境で、修正の影響が大きいようであれば、バージョンアップはしばらく見送った方がよいかもしれません。

3.0.6のバージョンで、ホスト名を指定せずに動作できるパッチ もあるようですけどね。


あと、このユーザー名を指定する方法は、バージョン2.6系でも問題なく動作します。

なので、予め同期するプログラム側のロジックを変更してバージョンアップに備えておくということをしておいてもよいかもしれません。