답변:
아파치를 쓰는 한 장소에 어떤 종류의 파일을 작성하고 완료되지 않은 경우 다음과 rsync
에서 차기를 rsync
복사합니다 어떤이 앉아있다.
Apache가 5MB 파일을 처리하는 경우 2MB 만 작성되어 rsync
시작되면 부분 2MB 파일이 복사됩니다. 따라서 해당 파일이 대상 서버에서 "손상된"것처럼 보입니다.
사용중인 파일의 크기에 따라 --inplace
옵션을 사용 rsync
하여 다음을 수행 할 수 있습니다 .
이 옵션은 파일의 데이터를 업데이트해야 할 때 rsync가 파일을 전송하는 방법을 변경합니다. 파일의 새 사본을 작성하고 파일이 완료되면 파일을 제자리로 옮기는 기본 방법 대신, rsync는 업데이트 된 데이터를 대상에 직접 씁니다. 파일.
5MB 파일에 첫 번째 실행에서 2MB 만 복사 된 경우 다음 실행에서 2MB를 선택하고 전체 5MB가 제자리에 올 때까지 파일을 계속 복사한다는 이점이 있습니다.
부정적인 점은 파일을 복사하는 동안 누군가가 웹 서버에 액세스하는 상황을 만들어서 부분 파일을 볼 수 있다는 것입니다. 제 생각 rsync
에는 "보이지 않는"파일을 캐싱 한 다음 즉시 제자리로 옮기는 것이 기본 동작에 가장 효과적입니다. 그러나 --inplace
큰 파일과 대역폭 제약 조건은 큰 파일을 정사각형 파일에서 쉽게 복사하는 방식에 방해가되는 시나리오에 적합합니다.
그것은 당신이 이것을 진술했다; 강조는 내 것입니다 :
5 분마다 cron run rsync…
그래서이 cron 작업을 관리하기 위해 bash 스크립트가 있다고 가정합니다. 글쎄, rsync
복사해야 할 파일 만 복사하기에 충분합니다. 그리고 5 분마다 실행되는 스크립트가 rsync
있으면 더 빨리 진행되면 서로 밟지 않는 것 같습니다. 즉, 1 분마다 rsync
실행하면 파일 크기 나 네트워크 속도로 인해 하나 이상의 프로세스가 여전히 실행 중이고 다음 프로세스가 경쟁 할 위험이 있습니다. 경주 조건.
이를 피하는 한 가지 방법은 전체 rsync
명령을 파일 잠금을 확인하는 bash 스크립트 로 래핑하는 것입니다 . 아래는 이와 같은 경우에 사용하는 상용구 bash 스크립트 프레임 워크입니다.
어떤 사람들은 사용을 권장 flock
하지만 flock
내가 사용하는 일부 시스템에는 설치되어 있지 않기 때문에 우분투 (그것이있는)와 Mac OS X (많지 않은) 사이를 뛰어 넘습니다. 나는이 간단한 프레임 워크를 아무런 문제없이 사용합니다.
LOCK_NAME="MY_GREAT_BASH_SCRIPT"
LOCK_DIR='/tmp/'${LOCK_NAME}.lock
PID_FILE=${LOCK_DIR}'/'${LOCK_NAME}'.pid'
if mkdir ${LOCK_DIR} 2>/dev/null; then
# If the ${LOCK_DIR} doesn't exist, then start working & store the ${PID_FILE}
echo $$ > ${PID_FILE}
echo "Hello world!"
rm -rf ${LOCK_DIR}
exit
else
if [ -f ${PID_FILE} ] && kill -0 $(cat ${PID_FILE}) 2>/dev/null; then
# Confirm that the process file exists & a process
# with that PID is truly running.
echo "Running [PID "$(cat ${PID_FILE})"]" >&2
exit
else
# If the process is not running, yet there is a PID file--like in the case
# of a crash or sudden reboot--then get rid of the ${LOCK_DIR}
rm -rf ${LOCK_DIR}
exit
fi
fi
아이디어는 제가 가지고있는 일반적인 핵심이 echo "Hello world!"
스크립트의 핵심입니다. 나머지는 기본적으로에 기반한 잠금 메커니즘 / 논리입니다 mkdir
. 개념에 대한 좋은 설명은 이 답변에 있습니다 .
mkdir 은 디렉토리가 존재하지 않으면 디렉토리를 작성하고 존재하는 경우 종료 코드를 설정합니다. 더 중요한 것은 단일 원자 동작 으로이 모든 것을 수행 하여이 시나리오에 적합합니다.
따라서 rsync
프로세스 의 경우 echo
명령을 명령으로 변경 하여이 스크립트를 사용하는 것이 좋습니다 rsync
. 또한을 LOCK_NAME
같은 것으로 변경하면 RSYNC_PROCESS
갈 수 있습니다.
이제이 rsync
스크립트에 싸서 두 개 이상의 rsync
프로세스가 동일한 작업을 수행하기 위해 경쟁하는 경합 조건의 위험없이 매분마다 cron 작업을 실행하도록 설정할 수 있습니다 . 이렇게하면 전송 속도 또는 rsync
업데이트 속도를 높일 수있어 전송되는 부분 파일의 문제를 제거하지는 않지만 전체 프로세스 속도를 높이는 데 도움이되므로 전체 파일을 특정 시점에 올바르게 복사 할 수 있습니다.
lsyncd
. "핫 폴더"를 사용하여 실제로 활동에주의를 기울이고 변경 사항이있을 때 해당 파일에 대해 작업 할 수 있습니다. 나는 rsync
대답에 요약 된대로 많이 사용 하지만 lsyncd
비 크론 / 더 즉각적인 행동 양식이 필요한 경우에 사용 합니다.
예-rsync가 파일을 쓰는 동시에 파일을 읽는 경우 파일이 손상되었을 수 있습니다.
이것을 시도 할 수 있습니다 : /unix//a/2558
lsof로 스크립트를 작성할 수도 있습니다.
lsof /path/to file
종료 코드 0은 파일이 사용 중임을 의미하고 종료 코드 1은 해당 파일에 대한 활동이 없음을 의미합니다.