[an error occurred while processing this directive]
rsync

=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=


よくある質問

HP でのコンパイル方法


HPUX でコンパイルする場合には、CFLAGS に -Ae オプションを付ける必要があります。
Makefile を編集して CFLAGS を以下のようにして下さい:

 CFLAGS=-Ae -O

"Read-only file system" エラーが出る


rsync サーバへ転送したときに "Read-only file system" エラーが出るのは、
あなたがそのモジュールで "read only = no" の設定をするのを忘れているからです。

全てのファイルをコピーしてしまう


rsync を使って小さなサブセットだけをコピーしようとしたら、すべてのファイルを
コピーしてしまった、という報告がしばしばあります。ほとんどの場合、rsync が
すべてのファイルをコピーすることはなくて、単にパーミッションやオーナーを
更新しようとして、なんらかの理由で失敗したせいです。グループの変更のような、
マイナーな変更があった場合でも、もしファイルになんらかの変更があれば、rsync は
 -v オプションでファイルを表示します。

もし誤って rsync が全てのファイルをコピーしてしまったようなら、-v で状態を見て、
rsync が本当にすべてのデータを転送しているのかどうか、確かめて下さい。

"is your shell clean" メッセージについて


"is your shell clean" というメッセージと "protocol mismatch" というメッセージは、
接続時にメッセージを書き込む .cshrc、.profile、.bashrc 等のファイルを使っている
プログラムによって生じます。この方法で書き込まれたデータは rsync のデータ転送で
壊れてしまいます。

これをテストする良い方法は以下です:

	rsh remotemachine /bin/true > test.dat

大きさがゼロの test.dat というファイルが作られるはずです。もし test.dat の大きさが
ゼロでなければ、"your shell is not clean" です。何が送信されたのか、test.dat の中身を
調べて下さい。問題解決のためには remotemachine の起動ファイルを調べて下さい。

"out of memory" になる理由


"out of memory" になる一般的な理由としては、走っている rsync が莫大な量のファイルを
転送していることが考えられます。この際関係があるのはファイルの全体数だけで、
ファイルのサイズは関係ありません。

大雑把に言うと、rsync はファイルリストにあるファイル毎に約100バイトを消費します。
これは rsync がそれぞれのファイルについての重要部分の詳細を全て持っている、内部リスト
構造を構築するからです。それが絶えず横断するため、rsync はメモリーに構造を維持することが
必要になります。

どんなにたくさんのファイルが転送されようとも、メモリーの消費量を最小限にするような
改良を考えてはいるのですが、その改良をするための1週間を消費することがまだできていません。


cron で rsync が起動しない


いくつかのシステム (特に SunOS4) では rsync に対してソケットのようなものを提供していますが、
rsync にとっては標準入力がソケットです。もしクーロン・ジョブから --daemon スイッチで
rsync を起動すると inetd から起動されたようになって、rsync を終了させてしまいます。

これを解決するのは簡単です。
- 単にクーロン・ジョブで /dev/null から標準入力をリダイレクトするだけです。

"rsync: Command not found" エラーが出る


> rsync: Command not found

このエラーは、rsync のバイナリーにリモート・シェルのパスが通っていない時に生じます。
解決策としては、以下の3つが挙げられます:

1) リモートのパスにある "standard" の場所に rsync をインストールします。

2) リモートのマシンにある .cshrc や .bashrc 等に rsync のあるパスを書き込みます。

3) --rsync-path オプションを使って、リモートのマシンにインストールされている rsync のパスを
指定します。

次のコマンドでリモートのパスを表示することができます:

	rsh samba 'echo $PATH'


ファイル名にスペースがあると・・・


Jim wrote:
> rsync は、ファイル名にスペースを含んでいるとコピーできないみたいです。
> man ページを grep してみたのですが、どこにも書いてありませんでした。

回答:rsync はファイル名にスペースを含んでいても大丈夫です。

詳細:

rsync は他の Unix コマンドラインのアプリケーションと同じようにスペースを扱います。
コードにあるスペースが何か別の文字として扱われるように、スペースを含んだファイル名は
別の文字のファイル名として扱われます。

スペースの問題はコマンドラインをインタープリータする argv の処理がされるせいです。
他の Unix アプリケーションのようにコマンドラインでスペースをエスケープしないと、
別個の引数になってしまいます。

rsync でちょっとやっかいなのは、rsync は rsync の対等コピーを実行するために、
リモートのシステムにコマンドラインを送信してしまうことです。コマンドラインは
リモートシェルによってインタープリータされるので、スペースはリモートのシステムで
エスケープされる必要があります。そうすればシェルはそのファイル名を複数の引数には
分割しません。

例:

	rsync -av fjall:'a long filename' /tmp/

リモートシェルは引用符の付かないファイル名では動きません。代わりにこうします:

	rsync -av fjall:'"a long filename"' /tmp/

あるいは、似たような方法でもいいです(動かす方法はたくさんあります)。

コマンドラインにあるリモートのファイル名がリモートのシェルからインタープリータされれば
うまく動くでしょう。

そのうち、上の例をドキュメントに書きましょう :-)

Cheers, Andrew



標準出力と標準エラーの生成について


> なぜ rsync は標準出力と標準エラーを生成するのですか?

リモートのコンピュータからの全てのメッセージは標準エラーに送られます。
ローカルのコンピュータからの全てのインフォメーション・メッセージは標準出力に送られます。
ローカルのコンピュータからの全てのエラー・メッセージは標準エラーに送られます。

これには理由があって、変更するのは困難です。理由というのは、rsync が実行の際に
リモートシェルを使っていることです。リモートシェルは標準出力と標準エラーを
生成します。流れ出す標準出力は rsync のプロトコルが使っています。この標準出力に
エラーメッセージを混ぜると余分なオーバーヘッドを生じて、プロトコルが複雑になって
しまいます。それぞれのメッセージはエスケープされる必要があり、メッセージがないと
なんらかの方法でエンコード化されなければならないからです。そこで rsync は常に
リモートのメッセージを標準エラーに送ります。ローカルのコンピュータで標準エラーが
現れるのはそういう訳です。rsync はそれを遮断することはできません。

標準エラーを生成することでスクリプトやクーロンに問題が生じるなら、
標準エラーを標準出力にリダイレクトさせてシェルを使うのを勧めます。
例えばクーロンなら:

0 0 * * * /usr/local/bin/rsync -avz /foobar /foo 2>&1 > logfile

これで標準エラーと標準出力は"logfile"に送られます。標準エラーを標準出力にリダイレクト
させているのは "2>&1" の部分です。


メーリングリストの購読について


> rsync のメーリングリストに参加するには?

本文に "subscribe rsync Your Name" を記述した空サブジェクトのメールを
"listproc@samba.org" 宛てに送って下さい。 

詳しくは、"http://lists.samba.org/" を見て下さい。




=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=


rsync ホームページ