久しぶりにハマった件について。
[rhel57]# rsync -az --delete --inplace --timeout=10 \
-e 'ssh -i /path/to/key' \
remote-host:/path/to/sync/ /path/to/sync
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: writefd_unbuffered failed to write 4 bytes to socket [receiver]: Broken pipe (32)
rsync error: unexplained error (code 255) at io.c(1525) [receiver=3.0.6]
いつも通り rsync を動かしたら、何か ssh のヘルプ出てきた。何これ、訳分かんない。
これにハマった理由は、
- 見た目が如何にも ssh の引数不備に見えた。
- 実際に動かなくなったスクリプトも ssh を使っていた。
- とはいえ、この間は確かに RHEL5.9 で動いていたのを確認済み。
これらに惑わされて原因の特定に手間取ってしまった。結局、「RHEL5.7 同梱の rsync でのみ発生する不具合」というオチだった。
- Red Hat Bugzilla - Bug 726060 - rsync 3.0.6 fails on hostname:/path syntax
- Red Hat Errata - RHBA-2011:1112-1 - rsync bug fix update
- RHEL Documents - 5.8 Technical Notes - 4.167. rsync
原因は分かったので、後は自作インストーラー側での対処。勿論、rsync をアップデートして貰えば解決する問題だが、「RHEL5.7 だったら rsync をアップデートしてね」とお願いするくらいなら、最初からインストーラー側で対処すべき。やることが「明確」ならば、自動化するのがセオリーだ。(逆に「臨機応変」が求められるものは、人間がやるべき)
バグ持ち rsync のバージョンは分かっているので、RHEL バージョンよりも rsync バージョンで判断する方がベター、ということでこんな感じ。
if [ 3.0.6-4.el5 = "`rpm -q --qf '%{VERSION}-%{RELEASE}' rsync`" ] ; then
rpm -Uvh rsync-3.0.6-4.el5_7.1.x86_64.rpm
fi
修正はこれで良いとして、いい加減、OS のマイナーアップデートでパッケージのメジャーバージョンを上げるのは止めて欲しい。
[rhel56]# rpm -q rsync
rsync-2.6.8-3.1
[rhel57]# rpm -q rsync
rsync-3.0.6-4.el5
RHEL に求めるのは安定性であって、最新パッケージを使いたかったら自分でビルドするか rpm を拾ってくるし。特に今回、基本的なツールである rsync が動かなくなったことで、泣かされた人も(当時は)多かったのではなかろうか。今回の不具合の拙さを考えると、「安易にパッケージのメジャーバージョンを上げるからだ」と言われても仕方ない。
0 件のコメント:
コメントを投稿
注: コメントを投稿できるのは、このブログのメンバーだけです。