powstrzymaj rsync przed usuwaniem niedokończonych plików źródłowych

169

Mam dwie maszyny, prędkość i masę. speed ma szybkie łącze internetowe i działa robot, który pobiera wiele plików na dysk. masa ma dużo miejsca na dysku. Chcę przenieść pliki z szybkości do masy po zakończeniu pobierania. Idealnie, po prostu uruchomiłbym:

$ rsync --remove-source-files speed:/var/crawldir .

ale martwię się, że rsync odłączy plik źródłowy, którego pobieranie jeszcze się nie zakończyło. (Spojrzałem na kod źródłowy i nie widziałem nic chroniącego przed tym.) Jakieś sugestie?

aaronsw
źródło

Odpowiedzi:

10

Wydaje mi się, że problem polega na przesyłaniu pliku, zanim zostanie ukończony, a nie na tym, że go usuwasz.

Jeśli jest to Linux, możliwe jest, że plik zostanie otwarty przez proces A, a proces B może odłączyć plik. Nie ma błędu, ale oczywiście A marnuje swój czas. Dlatego fakt, że rsync usuwa plik źródłowy, nie stanowi problemu.

Problem polega na tym, że rsync usuwa plik źródłowy dopiero po jego skopiowaniu, a jeśli nadal jest zapisywany na dysku, będziesz mieć częściowy plik.

Co powiesz na to: Zamontuj massjako zdalny system plików (działałby NFS) w speed. Następnie przeszukaj pliki bezpośrednio w Internecie.

Jason Cohen
źródło
9

Jak dużą kontrolę masz nad procesem pobierania? Jeśli utworzysz własny, możesz przenieść pobierany plik do katalogu tymczasowego lub mieć tymczasową nazwę do czasu zakończenia pobierania, a następnie przenieść go do poprawnej nazwy po zakończeniu. Jeśli używasz oprogramowania innej firmy, nie masz tak dużej kontroli, ale nadal możesz być w stanie zrobić coś z katalogu tymczasowego.

Paul Tomblin
źródło
3

Rsync może wykluczyć pliki pasujące do określonych wzorców. Nawet jeśli nie możesz go zmodyfikować, aby pobierał pliki do katalogu tymczasowego, być może ma konwencję nazywania plików inaczej podczas pobierania (na przykład: foo.downloadingpodczas pobierania pliku o nazwie foo) i możesz użyć tej właściwości do wykluczania plików które są nadal pobierane z kopiowania.

Szara Pantera
źródło
3

Jeśli masz kontrolę nad procesem indeksowania lub ma przewidywalne wyniki, powyższe rozwiązania (przechowywanie w pliku tymczasowym do zakończenia, a następnie przechodzenie do miejsca ukończonego pobierania lub ignorowanie plików z nazwą typu „.downloading”) może działać. Jeśli to wszystko jest poza twoją kontrolą, możesz upewnić się, że plik nie zostanie otwarty przez żaden proces, wykonując „lsof $ filename” i sprawdzając, czy jest wynik. Oczywiście, jeśli nikt nie otworzył pliku, można go bezpiecznie przenieść.

pjz
źródło