Як запустити команду після того, як завершиться скруб ZFS *?


11

Я хотів би використовувати cron для планування періодичних скрабів мого пулу ZFS, а через певний час після закінчення скрабу надсилайте собі звіт про стан. Мета цього - вирішити будь-які проблеми без необхідності їх вручну шукати (натискати, а не тягнути).

Перша частина проста: просто встановіть роботу cron для запуску zpool scrub $POOLяк root на будь-який інтервал, який є розумним у моїй конкретній ситуації.

Друга частина, я не зовсім впевнена, як це зробити. zpool scrubповертається негайно, а потім скраб запускається у фоновому режимі (що, безумовно, бажана поведінка, якщо скраб ініціюється адміністратором з терміналу). zpool statusдає мені звіт про стан і виходить (з кодом виходу 0, поки скраб працює; він ще не закінчений, тому я не знаю, чи зміниться статус виходу, коли це зроблено, але я сумніваюся в цьому). Єдиний параметр, задокументований для скрабування zpool, - це -s"зупинка очищення".

Основна проблема - виявлення зміни статусу від вишкрібання до закінченого очищення . Враховуючи це, решта повинна стати на місце.

В ідеалі я хотів би сказати zpool scrubне повертатися, поки скраб не закінчиться, але я не бачу жодного способу змусити це зробити. (Це зробило б майже занадто легким простувати крон zpool scrub --wait-until-done $POOL; zpool status $POOL.)

Якщо цього не зробити, я хотів би запитати систему, чи працює скраб в даний час, бажано таким чином, який не надто ризикує зламатись із оновленням або зміною конфігурації, щоб я міг діяти на те, чи не працює раніше скраб закінчено (виконуючи статус zpool, коли стан скрабу переходить від скрабування до не очищення).

Ця особлива настройка призначена для системи робочих станцій, тому, хоча інструмент моніторингу, наприклад Nagios, ймовірно, має надбудови, які вирішили б проблему, відчувається досить зайвим встановити такий інструмент лише для цього одного завдання. Чи може хтось запропонувати низькотехнологічне рішення проблеми?

Відповіді:


13

На ZFS в Linux , починаючи з версії 0.6.3, це можна впоратися досить елегантно, використовуючи Daemon Event ZemS (zed). Демон події, завдяки прямому моніторингу подій ядра, може практично негайно реагувати на будь-які події, що відбуваються, і не залежить від постійного опитування та розбору результатів деяких інших команд.

Створіть скрипт оболонки з будь-яким ім'ям файлу, що починається з /etc/zfs/zed.d/scrub.finish(наприклад, scrub.finish-custom.sh). Цей сценарій може вживати будь-яких відповідних дій, таких як надіслати електронний лист, записати запис у журнал десь або змусити систему співати та танцювати (ОК, може, не так). Наводяться приклади, які можуть дати вихідну точку.

Якщо все, що вам потрібно, це отримати електронний лист, коли скраб завершиться, наданий scrub.finish-email.shсценарій це зробить чудово. Просто відредагуйте /etc/zfs/zed.d/zed.rc, щоб вказати, куди слід надіслати електронний лист і чи слід надсилати електронний лист, якщо пул не має жодних проблем, переконайтеся, що з ім’ям щось scrub.finishсупроводжується чимось у / etc /zfs/zed.d веде до цього, і переконайтеся, що zed запускається під час завантаження.


про поточну реалізацію див. wiki.archlinux.org/index.php/ZFS#Monitoring_/_Mailing_on_Events
Stuart Cardall

3

Хоча це питання характерне для Linux, це перший результат Google при пошуку "зачекайте, поки закінчується скраб" , тому я хотів би додати корисну інформацію для людей, що працюють на OpenSolaris (тестували його на OmniOS, але SmartOS, ілюмінаторах тощо) . повинен бути схожий) замість Linux (звичайний Solaris також повинен працювати, але я його там не перевіряв).

Ви можете використовувати syseventadmдля реєстрації подій ядра. З повним списком можна ознайомитись /usr/include/sys/sysevent/eventdefs.h(просто шукайте "ZFS" у цьому файлі). Після додавання подій службу потрібно перезапустити, наприклад:

syseventadm add -c EC_zfs -s ESC_ZFS_scrub_finish /path/to/script.sh \$pool_name
syseventadm restart

Таким чином, сценарій буде запущений після завершення будь-якого вичищення будь-якого пулу - вам слід перевірити всередині сценарію, чи $1дорівнює бажаному імені пулу. Проте це набагато менше накладних витрат, ніж опитування.


2

Я використовую цей простий скрипт для очищення звітів про стан по електронній пошті.

Якщо вам потрібно виявити перехід від scrub runningдо, scrub finishedя би перевірив stateполе zpool statusвиводу. Щось на зразок цього:

# start scrubbing 
zpool scrub ZPOOL

# wait till scrub is finished
while zpool status ZPOOL | grep 'scan:  *scrub in progress' > /dev/null; do
   echo -n '.'
   sleep 10
done

# send a report
zpool status | mail -s "zpool status: ZPOOL" RECIPIENT

Я переглянув код, але, здається, він дає вам статус лише тоді, коли виконується сценарій. Як воно сповістило мене, коли статус перейде від "вичісування" до "закінченого"?
CVn

@ MichaelKjörling сценарій не закінчиться до тих пір, поки відбувається скраб через while ... doneперевірку циклу на цю саму умову.
the wabbit

Я думаю, що щось подібне - це шлях, який я піду. До речі, grep -qмає працювати також і у вашому фрагменті сценарію оболонки, не заперечуючи необхідності перенаправлення на / dev / null. :)
CVn

Так, я перевірив його на Solaris 10 з POSIX grep, у якого відсутня ця опція.
dsmsk80

А, добре. Однак GNU grep має -q з потрібною семантикою.
CVn

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.