3

毎分、記録されたファイルを3台のサーバーから1台のデータストレージにコピーする必要があります。元のファイルを保存する必要はありません。データ処理はすべてのファイルの外にあります。

しかし、オプションを使用する--remove-sent-filesと、rsyncは未完成の(閉じられていない)ファイルを送信および削除します。

私はこれらの開いているファイルをlsof--exclude-fromで送信しないように試みましたが、rsyncは除外リストのフルパスを理解していないようです:

--exclude-from=FILE     read exclude >>patterns<< from FILE

lsof | grep /projects/recordings/.\\+\\.\\S\\+ -o | sort | uniq
/projects/recordings/<uid>/<path>/2012-07-16 13:24:32.646970-<id>.WAV

したがって、スクリプトは次のようになります。

# get open files in src dir and put them into rsync.exclude file
lsof | grep /projects/recordings/.\\+\\.\\S\\+ -o | sort | uniq > /tmp/rsync.exclude
# sync without these files
/usr/bin/rsync -raz --progress --size-only --remove-sent-files --exclude-files=/tmp/rsync.excldude /projects/recordings/ site.com:/var/www/storage/recordings/
# change owner
ssh storage@site.com chown -hR storage:storage /var/www/storage/recordings

だから、私は別のツールを試すべきでしょうか?または、なぜrsyncはexludesをリッスンしないのですか?

4

2 に答える 2

5

これが役立つかどうかはわかりませんが、現在書き込まれていない rsync ファイルのみに対する私の解決策は次のとおりです。私はこれを tshark キャプチャに使用し、-a フラグを使用して N 秒ごとに新しいファイルに書き込みます (例: tshark -i eth0 -a duration:30 -w /foo/bar/caps)。そのトリッキーな rsync に注意してください。包含と除外の順序が重要です。サブディレクトリが必要な場合は、「*/」を含める必要があります。

-G

$save_path=/foo/bar/
$delay_between_syncs=30
while true;
do
 sleep $delay_between_syncs

 # Calculate which files are currently open (i.e. the ones currently being written to)
 # and avoid uploading it. This is to ensure that when we process files on the server, they
 # are complete.
 echo "" > /tmp/include_list.txt
 for i in `find $save_path/ -type f`
  do
    op=`fuser $i`
    if [ "$op" == "" ]
            then
                    #echo [+] $i is good for upload, will add it list.
                    c=`echo $i | sed 's/.*\///g'`
                    echo $c >> /tmp/include_list.txt
    fi
  done

 echo [+] Syncing...
 rsync -rzt --include-from=/tmp/include_list.txt --include="*/" --exclude \* $save_path user@server:/home/backup/foo/
 echo [+] Sunk... 

done
于 2012-08-06T09:20:39.347 に答える
0

ファイルを rsync し、転送されたファイルのリストを取得して rsync されたファイルを削除し、現在開いていない転送されたファイルのみを削除します。Rsync は、ディレクトリに到達したときに転送するファイルを判断するため、(rsync が開始されてから) 新しく開かれたファイルが除外リストに含まれていない場合、最初は機能していたとしても、ソリューションは後で失敗することになります。

別のアプローチは、

find dir -type f -name pattern -mmin +10 | xargs -i rsync -aP {} dest:/path/to/backups

于 2016-10-02T20:53:29.897 に答える