단일 인수를 허용하는 Bourne 쉘 스크립트가 있습니다(텍스트 파일 크기는 일반적으로 몇 KB입니다). 기본적으로 이 스크립트는 scp
이 텍스트 파일을 원격 서버에 복사하는 래퍼입니다 . 스크립트는 scp
원본 파일을 시도하지 않지만 파일의 하드 링크나 복사본을 생성합니다.
#!/bin/sh
TRANSFER_FILE=/var/tmp/acc_transfer_link_$$
INPUT_FILE=$1
# Linking is always a better option, so try it first
ln $INPUT_FILE $TRANSFER_FILE 2>/dev/null
RC=$?
if [ $RC -ne 0 ]; then
cp $INPUT_FILE $TRANSFER_FILE
fi
스크립트 작성자가 댓글을 남겼습니다.
링크는 항상 더 나은 옵션이므로 먼저 시도해 보세요.
왜 이런 일이 발생합니까? 하드 링크를 만드는 것보다 복사하는 데 시간이 조금 더 걸리기 때문인가요? 다른 이유가 있나요?
답변1
때에 따라 다르지.
링크를 설정하는 것이 데이터를 복사하는 것보다 빠르지만 결과 파일은 원본 파일과 동일한 내용을 가지며 수정 사항은 두 파일 모두에 표시됩니다. 이것이 장점인지 여부는 링크/카피를 만든 이유에 따라 다릅니다. 또한 하드 링크는 동일한 파일 시스템 내에서만 작동하므로 /var
마운트/var/tmp
가 소스 디렉토리와 별개인 경우 링크가 작동하지 않습니다.
하지만 여기서 사용 사례가 무엇인지 알고 싶습니다. 스크립트의 목적이 에 있는 파일을 복사하는 것이라면 원본 파일에서 직접 실행 되지 않고 $1
복사되는 이유는 무엇입니까 ? 먼저 로컬 복사는 복사 프로세스 중에 소스 파일이 수정되었을 수 있고 파일을 일관성 없는 상태로 복사해서는 안 된다고 가정할 이유가 있는 경우에만 필요합니다. 그러나 여기에는 접근 방식에 몇 가지 문제가 있습니다.$TRANSFER_FILE
scp
1) 로컬 복사본을 만드는 것도 cp
같은 문제가 있습니다. 로컬 복사본을 만드는 동안 소스가 수정될 수도 있습니다. 2) 링크 ln
는 즉각적이지만 하드 링크는 원본과 동일한 데이터를 가리키므로 링크 이전에 파일을 열었던 모든 프로세스는 계속해서 데이터를 수정할 수 있습니다.
링크한 후(유사한 방법을 사용하여) 파일이 다른 프로세스에서 열리지 않도록 하거나 lsof
, 일부 애플리케이션별 방법을 통해 복사본을 만들고 데이터의 일관성을 확인해야 합니다. 둘 다 그다지 간단하지 않기 때문에 원자적 수정을 수행하는 일반적인 방법은 파일의 새 복사본을 작성한 다음 이름을 이전 복사본으로 바꾸는 것입니다. 이렇게 하면 이름을 바꾸기 전에 파일을 연 프로세스는 이전 버전을 얻게 되고, 이름을 바꾼 후에 파일을 연 프로세스는 새 버전을 갖게 됩니다. 그러나 어느 쪽도 불완전한 사본을 볼 수는 없습니다. 단, 이는 파일을 읽는 프로그램에서가 아닌 파일을 수정할 때 이루어져야 합니다.