長すぎます。必要なディスク容量が確実に使用できる場合にのみ、他のインスタンスが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 ボリュームにあり、特定のジョブへのルートアクセスが許可されている場合は、そのファイルを使用できます。予約済みスペース特徴。予約済みスペースは通常、rootユーザーによって使用されますが、他のユーザーまたは別のグループに割り当てることができます。このユーザー/グループでrsyncプロセスを実行し、スケジュールされたスペースを調整します。tune2fs -m
rsyncを実行する前に。
ZFSまたはBtrfsプールのためのより柔軟なソリューションがあるかもしれませんが、方法はわかりません。