Mam dwa osobne katalogi. Użytkownik ładuje plik do pierwszego. W tle działa cronjob, który co 5 minut kopiuje pliki do drugiego katalogu.
Co się stanie, jeśli użytkownik nie ukończy przesyłania, a osoba wykonująca kopiowanie skopiuje pliki? Zauważ, że oba katalogi są własnością różnych użytkowników, cronjob jest wykonywany jako root.
cp
będzie czekać, aż plik zostanie całkowicie przesłany. Ponieważ oczekujemy, że szybkość transferu w sieci jest niższa niż tylko kopiowanie pliku z jednej lokalizacji do drugiej w tym samym hoście, w pewnym momenciecp
osiągnie bieżący koniec pliku i przestanie kopiować. Rozwiązanie problemu może być proste: najpierw użytkownik przesyła plik z jakąś specjalnie zniekształconą nazwą pliku (na przykład poprzedzony.
znakiem (kropka). Po zakończeniu przesyłania użytkownik zmienia nazwę na pierwotną nazwę. Następnie zadanie cron wygląda tylko dla plików, które nie są zaczynając.
.Odpowiedzi:
cp
nie wie o otwartych plikach. Więc jeśli pierwszy użytkownik prześle duży plik i cronjob (lub jakikolwiek inny proces) rozpocznie kopiowanie tego pliku, skopiuje tylko tyle, ile zostało już zapisane. Możesz o tym pomyśleć w ten sposób -cp
tworzy kopię tego, co aktualnie znajduje się na dysku, bez względu na to, czy plik jest kompletny. W przeciwnym razie nie można na przykład skopiować plików dziennika.źródło
fuser
+cp
. Taka kopia byłaby bardzo niewiarygodna. Nie skopiuje na przykład żadnego pliku, który zostanie otwarty w edytorze tekstu.lsof
? Wynik tego ma być łatwy do przetworzenia. Możesz filtrować otwierane pliki (powiedzmy, według instancjicp
) do zapisu.fuser
oczywiście), ponieważ to narzędzie może nie wyświetlać wszystkich plików.cp
nie wie, jakie inne programy mogą mieć otwarte pliki. Nie ma w tym magiicp
. Konstrukcja unixa celowo zapobiega nakładaniu jakichkolwiek blokad na pliki, chyba że istnieje ważny powód (przekonujący, co oznacza, że jądro go potrzebuje). W tym temacie zobacz Czy przekierowywanie danych wyjściowych do pliku powoduje zablokowanie pliku?Takie sytuacje, w których plik jest wytwarzany przez producenta i po skompletowaniu, konsumowany przez konsumenta, są powszechne. Zwykłym sposobem na poradzenie sobie z tym jest zapisanie przez producenta pliku tymczasowego, którego konsument nie będzie szukał, a następnie, gdy producent skończy, przenieś plik w miejsce, w którym konsument go znajdzie. Przenoszenie pliku (w tym samym systemie plików) jest operacją atomową: w pewnym momencie dla konsumenta plik zmienia się z nieobecności na bycie tam.
Więc zorganizuj zadanie przesyłania, aby przenieść pliki do innego katalogu po zakończeniu przesyłania. Skieruj zadanie crona na ten inny katalog.
źródło
Wygląda na to, że chcesz wykonać zadanie synchronizacji katalogu.
Ponieważ opcja -u, --update
cp
Możesz więc dodać cronjob, na przykład,
cp -auv SOURCEDIR/* DESTDIR
który skopiuje pliki, których czas modyfikacji się zmienił. Oznacza to,DESTDIR
że w końcu otrzymasz pełną kopię po zakończeniu przesyłania.rsync
mogę wykonać tę samą pracę. nprsync -av SOURCEDIR/ DESTDIR
.Chociaż zastosowano opcję -a, niektóre określone atrybuty (np. Własność) mogą być zachowane tylko przez superużytkownika.
Zobacz
man cp
,man rsync
aby poznać szczegóły.źródło