Как выполнить команду после *завершения* очистки ZFS?

Как выполнить команду после *завершения* очистки ZFS?

Я хотел бы использовать cron для планирования периодических очисток моего пула ZFS в достаточно короткие промежутки времени.после окончания чистки, отправить мне по электронной почте отчет о состоянии. Цель этого — выявить любые проблемы без необходимости вручную искать их (толкать, а не тянуть).

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

Вторая часть, я не совсем уверен, как это сделать. zpool scrubвозвращается немедленно, а затем очистка запускается в фоновом режиме системой (что, безусловно, желательное поведение, если очистка инициирована администратором из терминала). zpool statusдает мне отчет о состоянии и завершает работу (с кодом выхода 0 во время выполнения очистки; она еще не завершена, поэтому я не знаю, изменится ли статус выхода после ее завершения, но я сомневаюсь в этом). Единственный задокументированный параметр для zpool scrap — -s«остановить очистку».

Основная проблема — обнаружение изменения статуса счисткакзакончил чистку.Учитывая это, все остальное должно встать на свои места.

В идеале я бы хотел сказать, zpool scrubчтобы не возвращались, пока не закончится очистка, но я не вижу способа заставить его это сделать. (Это сделало бы слишком простым использование cron zpool scrub --wait-until-done $POOL; zpool status $POOL.)

Если это не удастся, я бы хотел спросить систему, выполняется ли в данный момент очистка, желательно таким образом, чтобы не было слишком большого риска ее поломки при обновлении или изменении конфигурации, чтобы я мог отреагировать на то, завершилась ли ранее запущенная очистка (выполнив статус zpool, когда статус очистки меняется с «очистка» на «отсутствие очистки»).

Эта конкретная настройка предназначена для системы рабочей станции, поэтому, хотя инструмент мониторинга, такой как Nagiosвероятноесть надстройки, которые могли бы решить эту проблему, но кажется излишним устанавливать такой инструмент только для этой одной задачи.Может ли кто-нибудь предложить менее технологичное решение этой проблемы?

решение1

НаZFS на Linux, начиная сверсия 0.6.3это можно сделать довольно элегантно, используяДемон событий ZFS (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 запускается при загрузке.

решение2

Хотя этот вопрос относится только к Linux, это первый результат поиска Google по запросу"подождите, пока очистка не закончится", поэтому я хотел бы добавить немного полезной информации для людей, использующих OpenSolaris (тестировал на OmniOS, но SmartOS, illumos и т. д. должны быть похожи) вместо 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соответствует ли он желаемому имени пула. Тем не менее, это намного меньше накладных расходов, чем опрос.

решение3

Я использую этот простой скрипт для очистки отчетов о статусе по электронной почте.

Если вам нужно обнаружить переход из 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

решение4

Последние версии ZFS добавили именно то, о чем просил автор: использование -wдля ожидания завершения очистки перед возвратом. Например:

zpool scrub tank -w ; zpool status tank | mail -s "report" [email protected]

Связанный контент