ignoruje używane (zapisywane) pliki podczas korzystania z rsync


Mam serwer SFTP, do którego klienci cały czas przesyłają duże pliki. Chcę okresowo kopiować wszystko

pełny

(w pełni pobrane) pliki na inny komputer w celu przetworzenia. Nie chcę kopiować pliku, który jest aktywnie zapisywany. Czy jest sposób, aby to osiągnąć? Obecnie używam rsync, ale jestem gotowy, aby przejść na coś innego.
Zaproszony:
Anonimowy użytkownik

Anonimowy użytkownik

Potwierdzenie od:

Aby sprawdzić, czy plik jest aktualnie otwarty (jeśli aktualnie zapisywany plik jest prawdopodobnie otwarty przez jakiś proces), standardowym sposobem jest użycie
         lsof
:
if lsof/your/file >/dev/null; then echo "file currently open"; fi

Możesz użyć tego fragmentu kodu, aby filtrować wyniki wyszukiwania tylko pod kątem nieotwartych plików i używać ich do zasilania rsync:
find . -type f -exec sh -c 'if ! lsof `readlink -f {}` >/dev/null; then echo `basename {}`; fi' \; | tr '\n' '\0' | rsync -avz --from0 --files-from=- ./ user@host:destination/

Kilka uwag:
  •            readlink -f         
    jest wymagane do określenia pełnej ścieżki do pliku, lsof akceptuje tylko pełną ścieżkę
  •            tr '\n' '\0'         
    naśladować znalezisko
               -print0         
Anonimowy użytkownik

Anonimowy użytkownik

Potwierdzenie od:

Jednym z problemów jest ustalenie, czy pliki są nadal zapisywane. Nie ma na to idealnego sposobu. Myślę, że najlepsze, co możesz zrobić, to po prostu sprawdzić ostatnio zmodyfikowany znacznik czasu w plikach i skopiować tylko te pliki, które nie zmieniły się w ciągu kilku minut.
         rsync
sam nie może tego zrobić, ale możesz to połączyć

znajdź polecenie
http://man7.org/linux/man-pages/man1/find.1.html
:
cd/path/to/directory/with/files
find ./ -type f -mmin +5 -print0 | rsync --archive --verbose --from0 --files-from=- ./ yourotherserver:targetdir/

Aby rozbić to polecenie, robi dwie rzeczy:
  • To używa
               find ./ -type f -mmin +5 -print0         
    aby zidentyfikować wszystkie pliki, które nie uległy zmianie od co najmniej 5 minut.
  • Następnie przekazuje tę listę do
               rsync         
    za pomocą
               --from0         
    i
               --files-from         
    parametry. To wystarczy
               rsync         
    rozważ tylko te pliki, które
               find         
    zidentyfikowane.

Aby odpowiedzieć na pytania, Zaloguj się lub Zarejestruj się