RDIST(1)

名称
rdist - リモートファイル配布プログラム

書式
rdist [-nqbRhivwyD] [-P rshcmd] [-f distfile] [-d var=value] [-m host] [name ...] rdist [-nqbRhivwyD] [-P rshcmd] -c name ... [login@] host[:dest]

解説
rdist は、複数のホストに対し、ファイルの内容を同一に維持するためのプログラムです。 本プログラムによるファイルコピーでは、可能な限り所有者、グループ、 アクセスモード、そして更新時刻を保存しようとします。 そして、現在実行中のプログラムの更新も可能です。 rdist は、コマンドを distfile から読み出し、その内容に従ってファイルやディレクトリの更新を制御します。

第 1 の書式特有のオプション:

-   distfile に ‘-’ を指定した場合、標準入力からデータを入力します。

-f distfile
    指定した distfile を使用します。

-f オプションも ‘-’ オプションも指定されない場合には、本プログラムは最初に “distfile” を、次に “Distfile” を探し、入力として使用します。 コマンド行にて何の指定も与えられない場合には、 rdist は、 distfile に記述されたすべてのファイルとディレクトリを更新します。 それ以外の場合では、引数は、更新対象となるファイル名あるいは 実行されるコマンドのラベルと解釈されます。 ラベルやファイル名が衝突する場合には、すべてラベルとして取り扱います。 これらの名前は、指定したコマンドを用いて指定したファイルを更新するのに 用いられます。

第 2 の書式特有のオプション:

-c  rdist に、残りの引数を小規模の distfile として解釈するように指示します。

    このオプションを使用した場合と等価な distfile は、以下のようになります。

    (name ...) -> [login@] host
    install [dest];

両方の書式に共通のオプション:

-P rshcmd
    rsh(1) と同様な機能を持つ他のプログラムをリモートサーバへの転送に使用します。 指定したプログラムはリモートサーバへバイナリ透過な経路を使用できる必要が あり、コマンド引数の書式が rsh(1) と互換でなければなりません。

-d var=value
    var に対して value を代入することを定義します。 -d オプションは、変数を定義したり、 distfile 中の変数を変更したりするのに用いられます。 value には、空白文字列、名前、もしくは括弧で囲まれて、タブやスペースで区切ら れた名前の列挙が指定可能です。

-h  シンボリックリンクを追いかけます。リンクしてあるファイルの場合、リンクファ イルそのものでなく、リンク先にある実体をコピーします。

-i  解決できないリンクを無視します。 rdist は、通常はリンクファイルについてもコピーを行ない、リンクが解決出来ない場合 には、その旨をユーザに通知します。

-m host
    ファイルを更新するホストを制限します。 複数の -m 引数を指定する事で、 distfile に記述のあるホスト名の中から複数のホスト名を選択して与えることが可能です。

-n  実行しないで、コマンド自身を表示します。本オプションは distfile のデバッグに有効です。

-q  QUIETモードに入ります。更新されるファイルについては、通常は標準出力に 表示されますが、 -q オプションはこの出力を抑制します。

-R  無関係なファイルを削除します。ディレクトリを更新する場合に、 リモートホスト上に存在するファイルが、配布元のディレクトリ中に存在しないなら、 該当するファイルを削除します。本オプションは、配布元と配布先で完全にディ レクトリ配下の内容を一致させたい場合に有効です。

-v  すべてのホストのファイルが最新の物であるかの確認を行ないます。すべての 古いファイルについては一覧が表示されますが、そのファイルが変更されたり、 そのファイルに関してシステムからメールが届いたりすることはありません。

-w  WHOLE モードを有効にします。指定されたファイル名全体が、配布先ディレクトリ名の 後に付加されます。通常は、ファイル名からディレクトリ名を取り除いた 最後の部分のみがファイル名を変更する時に使われます。 本オプションは、ディレクトリ構造をフラットにせず、配布元のディレクトリ 構造をそのまま配布先に持っていきたい場合に用いられます。例えば、 ( dir1/f1 dir2/f2 )のように表されるファイルを、dir3 というディレクトリに 配布した場合、配布先では dir3/f1 や dir3/f2 ではなく、 dir3/dir1/f1 や dir3/dir2/f2 が作成されます。

-y  YOUNGERモードを有効にします。通常、ファイルの更新は、 mtime と size ( stat(2) 参照) が一致しない場合に行なわれます。しかし、 -y オプションが有効になっている場合には、 rdist は、配布元のファイルより新しいファイルは更新しません。 通常本オプションは、他のホストに存在する、より新しいファイルを置き換えない 目的で用いられます。 配布元より新しいファイルが配布先にあった場合には、その旨を通知する メッセージが表示されます。

-D  デバッグモード。

distfile は、コピーされるファイル、配布先ホスト、そして更新のための手順を指定 するエントリを含みます。各エントリは、以下の形式のいずれかに分類され ます。

    <variable name> `=' <name list>
    [label:]<source list> `->' <destination list> <command list>
    [label:]<source list> `::' <time_stamp file> <command list>

一番目の形式は、値を定義するのに用いられます。 二番目の形式は、他のホストへファイルを配布するのに用いられます。 三番目の形式は、指定した日付以降に更新されたファイルの一覧を作成するのに 用いられます。 source list は、配布元のファイルやディレクトリの一覧を指定します。 destination list は、ファイルの配布先のホスト一覧です。配布元ファイルリスト (source list) 中の各ファイルが、更新を行なおうとしているホストにおいて古いもの である(二番目の形式)か、または、指定のファイルのタイムスタンプより新し い場合(三番目の形式)には、変更対象リストに追加されます。

ラベルの使用は、任意です。ラベルについては、部分的な変更を行う場合 に、コマンドを識別するために用いられます。

改行、タブ、そして空白は、セパレータとしてのみ用いられ、それ以外の場で 用いられた場合には無視されます。コメントは、`#' で始まり改行で終ります。

`$' で始まり、1文字もしくは `{''}' でくくられた名前の変数については、処理中に その値に置き換えられます(最後に出てくる例を参照して下さい)。

配布元ファイルリストと配布先ホストリストの一覧は、以下の形式を取ります。

    <名前>

または
    `(' <空白で区切られた 0 個以上の名前> `)'

シェルのメタ文字であるところの `[', `]', `{', `}', `*', そして `?' は、(配布元のホスト上でのみ) csh(1) 同様に解釈され、展開されます。 これは、バックスラッシュを用いて回避する事が出来ます。 `~' 文字もまた、 csh(1) 同様に展開されますが、配布元と配布先のホストで別々に展開されます。 -w オプションが `~' ではじまるファイル名とともに用いられた場合、ホームディ レクトリを除くすべてのファイル／ディレクトリ名が配布先の名前に加えられます。 `/' や `~' 以外の文字ではじまるファイル名は、配布先のユーザのホームディ レクトリをルートディレクトリとみなして、指定されたファイルの名前を 追加して配布先でのファイル名を作成します。

コマンドリストは、以下の形式に従った、0 個以上のコマンドからなります。
`install' | <options> | opt_dest_name `;'
`notify' | <name list> | `;'
`except' | <name list> | `;'
`except_pat' | <pattern list> | `;'
`special' | <name list> | string `;'

install コマンドは、古いファイルやディレクトリをコピーするのに用いられます。 各配布元のファイルは、配布先ホストリスト中の各ホストへコピーさ れます。ディレクトリも同様にして、再帰的にコピーされます。 opt_dest_name は、ファイル名を変更するための任意的なパラメータです。 install コマンドがコマンドリストに存在しない場合や、配布先での ファイル名が指定されていない場合、配布元のファイル名がそ のまま配布先でのファイル名として採用されます。 パス名に含まれるディレクトリが配布先のホスト上に存在しない 場合には、そのディレクトリを作成します。 不慮の事故を回避するために、配布先のホスト上に空でないディレクトリがあっ ても、通常のファイルやシンボリックリンクに置き換えたりはしません。 しかし、`-R'オプションを付加して実行した場合には、配布元のディレクト リに当該ファイルが存在しなければ、空でないディレクトリでも削除されます。 option には、`-R', `-h', `-i', `-v', `-w', `-y', `-b' があり、それらが配布元ファイルリストに記述されたファイルに対 してのみ適用される事を除いて、コマンドライン中に指定した事と同じ意味と なります。 配布先ホストにおけるログイン名は、配布元でのログイン名と同じですが、配 布先のログイン名が ``login@host" という形式で指定されている場合にはこの 限りではありません。

notify コマンドは、更新されたファイル一覧(および、発生した何らかのエラー)をメール によって通知する場合に用いられます。 指定のメールアドレス中に `@' がない場合には、配布先のホスト名がメールア ドレスに付加されます(例: name1@host, name2@host, ...)。

except コマンドは、 name list に列挙されているファイルを除き、配布元ファイルリストに記述されているすべての ファイルを更新するのに用いられます。 本コマンドは、特定ファイルを除くすべてのファイルをコピーするのに用い られます。

except_pat コマンドは、 except コマンドと似ていますが、 pattern list として正規表現を用いたリストを指定できるところが異なります (詳細については、 re_format(7) を参照して下さい)。 ファイル名に含まれる文字列が、正規表現のパターンに一致すると、そのファ イルは無視されます。 `\' が文字をクオートする事に注意して下さい。正規表現に含めるためには、 2 個続ける必要があります。 pattern list の中の変数は展開されますが、シェルのファイルパターンマッチ方法とは異なります。 `$' を含めるためには、`\' を用いてエスケープする必要があります。

special コマンドは、 name list にて指定されたファイルを更新、または、コピーした後に、配布先の ホスト上で実行される sh(1) コマンドを指定するのに用いられます。 name list が省略された場合には、シェルコマンドは各ファイルの更新が終了する度に 実行されます。シェル変数 `FILE' には、 文字列 string で指定したコマンドを実行する前に、直前に処理したファイル名が格納されます。 文字列 string を、`"'で囲む事で、 distfile において複数行にわたって記述する事が出来ます。 シェルに対する複数の実行コマンドは、`;'で区切られる必要があります。 指定されたコマンドは、ファイルの更新を行なおうとしている配布先ホストの 当該ユーザのホームディレクトリで実行されます。 special コマンドは、プログラムがファイルを更新した後にプライベートデータベース を再構築する用途をはじめとして、いろいろな場面で用いる事が出来ます。

以下に示す例は簡単な一例です。

    HOSTS = ( matisse root@arpa )
    FILES = ( /bin /lib /usr/bin /usr/games
    	/usr/include/{*.h,{stand,sys,vax*,pascal,machine}/*.h}
    	/usr/lib /usr/man/man? /usr/ucb /usr/local/rdist )
    EXLIB = ( Mail.rc aliases aliases.dir aliases.pag crontab dshrc
    	sendmail.cf sendmail.fc sendmail.hf sendmail.st uucp vfont )
    ${FILES} -> ${HOSTS}
    	install -R ;
    	except /usr/lib/${EXLIB} ;
    	except /usr/games/lib ;
    	special /usr/lib/sendmail "/usr/lib/sendmail -bz" ;
    srcs:
    /usr/src/bin -> arpa
    	except_pat ( \\.o\$ /SCCS\$ ) ;
    IMAGEN = (ips dviimp catdvi)
    imagen:
    /usr/local/${IMAGEN} -> arpa
    	install /usr/local/lib ;
    	notify ralph ;
    ${FILES} :: stamp.cory
    	notify root@cory ;

関連ファイル
distfile
    入力コマンドファイル
/tmp/rdist*
    更新リストのために用いられる一時ファイル

関連項目
csh(1), sh(1), stat(2), re_format(7)

歴史
rdist コマンドは、 4.3BSD から登場しました。

診断
rdist のバージョン不一致についての通知は、実際にはシェルを起動する際の 何らかの問題に起因して発生します。例えば、ユーザの所属グループがあまり 多すぎるなどが挙げられます。

rdist は、 rcmd(3) タイプのリモートサービス実行が、静かに成功することに依存します。 よくある誤りとしては、非対話の初期化スクリプト、例えば .cshrc が出力を行なってしまうことがあります (出力を行う他のプログラムを実行するものの、 そのプログラムが端末に接続されていないということもあります -- よくある原因が stty(1) です)。 このような余計な出力のために、 rdist が失敗して次のようなエラーメッセージが表示されます:

    rdist: connection failed: version numbers don't match

バグ
配布元ファイルは、 rdist コマンドが起動される配布元ホストに存在しなければなりません。

ディレクトリ配下のすべてのファイルが更新された後に special コマンドを実行 するのは困難です。

変数の置換は、name list に対してのみ働きます。より一般的なマクロ の機能があるべきでしょう。

rdist は、負 (1970 年 1 月 1 日以前の日付)の mtime を持つファイルに対してのアクセスを 行うと異常終了します。

空でないディレクトリを通常ファイルやシンボリックリンクで置換できる、 `force' オプションがあるべきでしょう。内容自体は一致しているファイルのモード や所有者を更新する方法も必要でしょう。