Rsync
rsync 選項排除部分文件
我們
rsync
用於在同一台機器上同步兩個文件夾。文件將從另一個應用程序寫入源文件夾。我們遇到的問題是,即使文件沒有完全寫入/複製到源文件夾,rsync 也會將該文件複製到目標。
是否有任何方法/選項可以僅從源文件夾中檢查/傳輸完整文件
如果文件的大小是固定的(在應用程序的寫入操作之後),您可以只傳輸基於大小的文件,因此不會複製尚未寫入的文件:
--max-size=SIZE don't transfer any file larger than SIZE --min-size=SIZE don't transfer any file smaller than SIZE
選項
rsync
提供了這一點。或者,您可以使用
fuser
或lsof
檢查應用程序是否在開始傳輸時正在寫入文件:if fuser /path/to/file.txt >/dev/null 2>&1; do rsync .... else sleep 10 fi
排除部分文件是不可能的,因為沒有這樣的概念。一旦生產者創建了文件,文件就存在了,但它一開始是空的,然後逐漸被填滿。
可以測試文件是否打開寫;那會告訴你它是不完整的。然而,這並不可靠:如果生產者崩潰(程序崩潰或整個系統崩潰),您將得到一個看起來完整的不完整文件。
您應該做的是為生產者定義一個協議以將文件標記為完整。執行此操作的正常方法(幾乎是唯一明智的方法)是讓生產者在臨時位置創建文件,然後在完成後將其移動到位(使用
rename
系統呼叫或mv
shell 命令)。您可以使用命名約定:
- 生產者:寫入
$FILENAME.tmp
,然後移動到最終文件。generate_data >"dir/$FILENAME.tmp" mv "dir/$FILENAME.tmp" "dir/$FILENAME"
- 消費者:排除
.tmp
文件。rsync -a --exclude='*.tmp' dir remote:
或者,您可以使用暫存目錄。
- 生產者:寫入暫存目錄,然後移動到最終位置。
generate_data >"dir/staging/$FILENAME" mv "dir/staging/$FILENAME" "dir/"
- 消費者:排除暫存目錄。
rsync -a --exclude='/staging' dir remote: