Używam rsync do tworzenia kopii zapasowych niektórych danych z jednego serwera na drugi. Wszystko działa dobrze, ale może potrwać dłużej, w zależności od ilości danych do przesłania.
Czy istnieje jakiś sposób, aby upewnić się, że polecenie rsync nie uruchomi się, zanim poprzednie nie zakończy korzystania z cronjob?
Na przykład co godzinę uruchamiam polecenie rsync, ale możliwe jest, że transfer trwa dłużej niż godzinę, więc następna rozpocznie się przed zakończeniem poprzedniej.
Odpowiedzi:
Możesz wdrożyć pewien rodzaj blokady. Spowoduje to wydrukowanie liczby uruchomionych procesów rsync:
Spowoduje to uruchomienie rsync tylko wtedy, gdy nie istnieje żaden inny proces rsync:
Użycie
-x
zapobiegnie przypadkowemu dopasowaniu niechcianych nazw (na przykład „fooba rsync hronizator” lub „not_an_ rsync _totally ” - działa tak jakpgrep -c ^rsync$
)źródło
Możesz użyć polecenia flock, aby to zrobić, np. W tym przypadku
flock -n
prawdopodobnie jest to, co chcesz, ponieważ spowoduje natychmiastową awarię polecenia, jeśli nie może uzyskać blokady, np.źródło
/var/run
zamiast.Jeśli chcesz rozważyć inne narzędzia, możesz także zapoznać się z rdiff-backup . Używa librsync do wykonywania kopii zapasowych i zapisuje konfigurowalną liczbę delt / przyrostów. Blokuje się również, aby w danym momencie mógł działać tylko jeden proces tworzenia kopii zapasowych rdiff.
źródło
Oto co bym zrobił. Utwórz skrypt otoki wokół rsync, aby utworzyć plik blokady.
źródło
Moja odpowiedź jest nieco taka sama, jak powiedział Mike.
W skrypcie powinieneś umieścić coś takiego:
Ale jest jedna bardzo ważna rzecz, którą powinieneś zrobić. i żeby wprowadzić system pułapek.
Tak więc dzięki temu, nawet jeśli w jakiś sposób twój skrypt zostanie zabity lub ktoś go zabije, możesz złapać ten sygnał i usunąć plik blokady, aby nie mieć nieaktualnego pliku blokady.
Można przeczytać, jak wdrożyć, że ponad tutaj .
Tylko jedna mała rzecz, nie możesz złapać pułapki na sygnał 9, to znaczy, jeśli ktoś tak zrobi
kill -9
, nie możesz złapać tego w pułapkę, ponieważ ten sygnał bezpośrednio oddziałuje z jądrem i nie ma sposobu, aby to zrobić.Ponadto, zgodnie z sugestią Johna, musisz usunąć plik blokady przy każdym ponownym uruchomieniu systemu, aby upewnić się, że nie ma już przestarzałego pliku.
Można to łatwo zrobić, umieszczając małe
rm -f <FILE>
polecenie w /etc/rc.localźródło
Spójrz na anakron (anachroniczny cron) z przełącznikiem -s (serializuj). Serializacja zapewnia, że polecenie nie zostanie ponownie wywołane, jeśli poprzednie nadal działa.
źródło
Użyj hatools ( http://www.fatalmind.com/software/hatools/ ), aby zablokować cron rsync w trybie oczekiwania.
źródło
flock(1)
Nie mogłem dostać rozwiązania mgabriel do pracy na OSX, ponieważ wersja pgrep w OSX nie wydaje się mieć opcji -c (zakładam, że jest to do zliczenia). Zamiast tego użyłem następującego:
Użyłem polecenia ping jako polecenia przykładowego.
Mam nadzieję że to pomoże.
źródło