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


11

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

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

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

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

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

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

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

Ответы:


13

В 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 запущен при загрузке.



3

Хотя этот вопрос относится только к Linux, он является первым результатом поиска Google при поиске «дождаться окончания очистки» , поэтому я хотел бы добавить некоторую полезную информацию для людей, работающих под управлением OpenSolaris (проверено на OmniOS, но на SmartOS, illumos и т. Д.). должно быть похоже) вместо линукса (нормальный солярис тоже должен работать, но я там не тестировал).

Вы можете использовать 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 15.09.13

Ах хорошо. GNU grep имеет -q с желаемой семантикой.
CVn

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.