Назад | Перейти на главную страницу

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

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

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

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

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

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

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

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

На 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 запускается при загрузке.

Хотя этот вопрос специфичен для 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 соответствует желаемому имени пула. Тем не менее, это намного меньше накладных расходов, чем опрос.

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

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

Я добился большого успеха с zfswatcher