RDIST(1)

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

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

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

オプション指定は、書式のところで説明があったような形式て可能です。

-   distfile が ‘-’ だった場合、標準入力からのデータが採用されます。

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

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

オプションは、書式に記述した形式にそって指定可能です。

-c  rdist が、残りの引数を小さい distfile として解釈することを強制します。

    distfile と同等のものは、以下の通りです。

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

2つとも同じことを意味します。

-b  バイナリ比較を行います。日付とサイズ以外に差異が出る部分があった場合、 バイナリ比較を行い、ファイル更新を行います。

-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 ) のように表されるファイルを、rdist を w オプションを 付加して dir3 というディレクトリに配布した場合、配布先では dir3/f1 や dir3/f2 といった構造でなく、dir3/dir1/f1 や dir3/dir2/f2 といった構造 を取ります。

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

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

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

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

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

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

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

配布元と配布先の一覧は、以下の形式を取ります。

    <name>

or
    `(' <zero or more names separated by white-space> `)'

シェルのメタ文字であるところの `[', `]', `{', `}', `*', `?' は、配布元のホスト上でのみ 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'オプションを付加して実行した場合には、配布先の 当該ファイルが消える以外は特に不具合は生じません。 options rdistのオプションとしては、`-R', `-h', `-i', `-v', `-w', `-y', `-b' などがあり、コマンドラインのうち配布元リストに対して適用されるものを除いた ものに対して付加されるオプションと同じセマンティクスを持ちます。 配布先で用いられるログイン名は、配布元でのログイン名と同じですが、配布先の ログイン名が``login@host"という形式で指定されている場合にはこの限りでは ありません。

notify コマンドは、列挙されたファイルが更新されたことをメールによって通知する 場合に用いられます。また、エラー発生もこのコマンドを用いることで通知されます。 ログイン名中に `@' が見られない場合には、配布先のホストが名前に付加され ます (例:name1@host, name2@host, ...)。

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

except_pat コマンドは、 except コマンドと似てますが、 pattern list として正規表現を用いたリストを指定できるところが異なります (詳細については、 ed(1) を参照して下さい)。

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
    入力コマンドファイル input command file
/tmp/rdist*
    更新リストのために用いられる一時ファイル

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

歴史
rdist コマンドは、 4.3BSD で初めて実装されました。

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

バグ
配布元ファイルは、 rdist 起動時には配布元に存在するようにしなければなりません。

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

変数の置き換えは、name list に対してのみ発生します。これは、一般的なマクロ の機能です。

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

通常ファイルやシンボリックリンクファイルなどが格納されていて、完全に空で ないディレクトリに対して更新を行う場合には、`force' オプションを 付加して下さい。ファイルモードやオーナをもう一方のファイルと同一にする手段が 必要とされています。