너무 길어요.필요한 디스크 공간을 확실히 사용할 수 있는 경우에만 rsync
다른 인스턴스가 실행되도록 이런 일이 발생하기 전에 특정 양의 디스크 공간을 예약(또는 "요청"?) 하고 싶습니다 .rsync
배경
작업( 실행되는 셸 스크립트 rsync
)은 다음을 수행합니다.
rsync
원본 디스크에서 다른 대상 디스크로 대량의 데이터를 복사하는 데 사용됩니다.- 복사된 데이터로 작업 수행
- 복사된 데이터 삭제
작업 스크립트의 여러 인스턴스가 동시에 실행될 수 있습니다.
내 생각엔 가끔,여러 작업 스크립트를 동시에 실행 rsync
하고 사용 가능한 모든 디스크 공간을 사용합니다. 모든 rsync
인스턴스가 실패합니다(따라서 작업이 실패함).
의사코드
이것이 내가 상상하는 알고리즘이다:
$job = get_next_incoming_job()
$disk_dst = $job.disk_dst() # destination disk for rsync
$space_need = $job.calculate_space_needed()
_check_space: # jump label
if $space_need > space_available($disk_dst) then
sleep $RANDOM
goto _check_space:
$handle = reserve_space($disk_dst, $space_need) # How??
# rsync will "fill-in" the reserved space - How??
rsync $job.source_data_path() $disk_dst/$job.ID/
do work using $disk_dst/$job.ID/
remove $disk_dst/$job.ID/
release_reserved_space($handle) # How??
이 마법의 함수는 보고된 여유 공간(반환된 값)을 reserve_space
즉시 변경합니다 . 다른 작업 인스턴스는 더 적은 공간을 반환합니다.$disk_dst
space_available
rsync
space_available()
즉시(따라서 작업을 나중으로 연기합니다.)
현재 space_available()
(실제 프로그램을 통해) df
인스턴스가 실행되는 동안 감소하는 숫자가 반환됩니다. rsync
문제는 여러 rsync
인스턴스가 실행되는 동안 공간이 부족할 수 있다는 것입니다. 인스턴스가 완료될 수 있다고 확신할 때만 실행되기를 원합니다 rsync
(즉, 실행 중에 디스크 공간이 부족해지지 않음).
답변1
reserve
파일 시스템 독립 도구 사용을 고집한다면 필요한 크기의 (희소하지 않은!) 파일을 생성해야 하는 디스크 공간을 실제로 할당하는 것 외에는 다른 방법을 생각할 수 없습니다. 이 파일은 전에 삭제되어야 합니다 rsync
.
파일이 ext2/ext3/ext4 볼륨에 있고 특정 작업에 루트 액세스가 허용되는 경우 해당 파일을 사용할 수 있습니다.예약된 공간특징. 예약된 공간은 일반적으로 루트 사용자가 사용하지만 다른 사용자나 다른 그룹에 할당할 수 있습니다. 이 사용자/그룹으로 rsync 프로세스를 실행하고 예약된 공간을 조정합니다.tune2fs -m
rsync를 실행하기 전에.
ZFS 또는 Btrfs 풀을 위한 보다 유연한 솔루션이 있을 수 있지만 방법은 모르겠습니다.