Chciałbym użyć crona, aby zaplanować okresowe szorowanie mojej puli ZFS, i w pewnym rozsądnym czasie po zakończeniu szorowania , wyślij mi e-mailem raport o stanie. Ma to na celu wychwycenie problemów bez konieczności ich ręcznego wyszukiwania (push zamiast pull).
Pierwsza część jest łatwa: wystarczy skonfigurować zadanie crona, aby działało zpool scrub $POOL
jako root w dowolnym przedziale czasu, który jest rozsądny w mojej konkretnej sytuacji.
Druga część, nie jestem do końca pewien, jak to zrobić. zpool scrub
natychmiast wraca, a następnie szorowanie jest uruchamiane w tle przez system (co jest z pewnością pożądanym zachowaniem, jeśli szorowanie jest inicjowane przez administratora z terminala). zpool status
daje mi raport o stanie i wychodzi (z kodem wyjścia 0, gdy szorowanie jest uruchomione; jeszcze się nie skończyło, więc nie wiem, czy status wyjścia zmienia się po zakończeniu, ale wątpię). Jedynym parametrem udokumentowanym dla szorowania zpool jest -s
„zatrzymanie szorowania”.
Głównym problemem jest wykrycie zmiany statusu z szorowania na szorowanie zakończone . Biorąc to pod uwagę, reszta powinna się ułożyć.
Idealnie, chciałbym powiedzieć, zpool scrub
żeby nie wracać, dopóki szorowanie się nie skończy, ale nie widzę żadnego sposobu, aby to zrobić. (Ułatwiłoby to po prostu cron zpool scrub --wait-until-done $POOL; zpool status $POOL
.)
W przeciwnym razie chciałbym zapytać system, czy proces czyszczenia jest w toku, najlepiej w sposób, który nie powoduje zbyt dużego ryzyka zerwania z aktualizacją lub zmianą konfiguracji, dzięki czemu mogę podjąć decyzję, czy poprzednio działający szorowanie zostało zakończone (przez wykonanie statusu zpool, gdy stan szorowania zmienia się z szorowania na brak szorowania).
Ta szczególna konfiguracja dotyczy systemu stacji roboczej, więc chociaż narzędzie do monitorowania, takie jak Nagios, prawdopodobnie zawiera dodatki, które rozwiązałyby problem, wydaje się, że zainstalowanie takiego narzędzia tylko do tego jednego zadania jest przesadą. Czy ktoś może zasugerować rozwiązanie problemu niższej technologii?
źródło
Chociaż to pytanie jest specyficzne dla systemu Linux, jest to pierwszy wynik wyszukiwania Google podczas wyszukiwania „poczekaj, aż scrub zostanie zakończony” , dlatego chciałbym dodać kilka użytecznych informacji dla osób korzystających z OpenSolaris (przetestowałem go na OmniOS, ale SmartOS, illumos itp. powinien być podobny) zamiast Linuksa (normalne Solaris również powinno działać, ale tam go nie testowałem).
Możesz użyć
syseventadm
do zarejestrowania zdarzeń jądra. Pełna lista znajduje się w/usr/include/sys/sysevent/eventdefs.h
(wystarczy wyszukać „ZFS” w tym pliku). Po dodaniu zdarzeń usługa musi zostać zrestartowana, na przykład:W ten sposób skrypt zostanie uruchomiony po zakończeniu szorowania dowolnej puli - musisz sprawdzić w skrypcie, czy
$1
jest równa żądanej nazwie puli. Mimo to jest o wiele mniej narzutów niż odpytywanie.źródło
Używam tego prostego skryptu do szorowania raportów stanu przez e-mail.
Jeśli chcesz wykryć przejście od
scrub running
doscrub finished
, sprawdziłbymstate
polezpool status
wyjściowe. Coś takiego:źródło
while ... done
sprawdzania pętli dla tego stanu.grep -q
powinien również działać w twoim fragmencie skryptu powłoki, negując potrzebę przekierowania do / dev / null. :)Odniosłem duży sukces z zfswatcher
źródło