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 에 기술된 모든 파일과 디렉토리를 갱신합니다. 그 이외의 경우에서는, 인수는, 갱신 대상이 되는 파일명 혹은 실행되는 명령의 label라고 해석됩니다. label나 파일명이 충돌하는 경우에는, 모두 label로서 취급합니다. 이러한 이름은, 지정한 명령을 이용해 지정한 파일을 갱신하는데 이용됩니다.

제 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>

첫번째의 형식은, 값을 정의하는데 이용됩니다. 두번째의 형식은, 다른 호스트에 파일을 배포하는데 이용됩니다. 3번째의 형식은, 지정한 일자 이후에 갱신된 파일의 일람을 작성하는데 이용됩니다. source list (은)는, 배포원의 파일이나 디렉토리의 일람을 지정합니다. destination list (은)는, 파일의 배포처의 호스트 일람입니다. 배포원파일 리스트 (source list) 안의 각 파일이, 갱신을 행하려 하고 있는 호스트에 대해 낡은 걸 인(두번째의 형식)인가, 또는, 지정의 파일의 타임 스탬프보다 신해 있고 경우(3번째의 형식)에는, 변경 대상 리스트에 추가됩니다.

label의 사용은, 임의입니다. label에 대해서는, 부분적인 변경을 실시하는 경우 에, 명령을 식별하기 위해서 이용됩니다.

개행, 탭, 그리고 공백은, separator로서의 보고 이용되어 그 이외의 장소에서 이용되었을 경우에는 무시됩니다. 코멘트는,`#'로 시작 개행으로 끝납니다.

`$'로 시작되어, 1 캐릭터 혹은 `{''}'로 묶어진 이름의 변수에 대해서는, 처리중에 그 값으로 옮겨집니다(마지막에 나오는 예를 참조해 주세요).

배포원파일 리스트와 배포처 호스트 리스트의 일람은, 이하의 형식을 취합니다.

    <이름>

또는
    `(' <공백에서 단락지어진 0 개 이상의 이름> `)'

쉘의 메타 캐릭터인 곳(중)의 `[', `]', `{', `}', `*', 그리고 `? ' (은)는, (배포원의 호스트상에서만) csh(1) (와)과 같이 해석되어 전개됩니다. 이것은, backslash를 이용해 회피할 수가 있습니다. `~'캐릭터도 또, 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 를 가지는 파일에 대해서의 액세스를 실시하면 이상종료(ABEND) 합니다.

하늘이 아닌 디렉토리를 통상 파일이나 기호 연결로 치환할 수 있는, `force'옵션이 있어야 하는 것이지요. 내용 자체는 일치하고 있는 파일의 모드 (이)나 소유자를 갱신하는 방법도 필요하겠지요.