ZFSスクラブが*完了*したらコマンドを実行する方法は?


11

cronを使用してZFSプールの定期的なスクラブをスケジュールし、スクラブが完了してからしばらくしてから、ステータスレポートを自分にメールで送信したいと考えています。これの目的は、手動でそれらを探すことなく(プルではなくプッシュ)、問題をキャッチすることです。

最初の部分は簡単ですzpool scrub $POOL。私の特定の状況で妥当な間隔でrootとして実行されるようにcronジョブを設定するだけです。

第二部、どうすればいいのかよくわかりません。zpool scrubすぐに戻り、スクラブはシステムによってバックグラウンドで実行されます(スクラブが端末から管理者によって開始された場合、これは確かに望ましい動作です)。zpool statusステータスレポートを表示して終了します(スクラブの実行中は終了コード0で終了します。まだ終了していないため、終了ステータスが変更されたかどうかはわかりませんが、疑います)。zpool scrubについて文書化されている唯一のパラメーターは-s、「スクラブの停止」用です。

主な問題は、からのステータスの変更を検出しているスクラブ仕上がっスクラブそれが与えられれば、残りは適切な場所に収まるはずです。

理想的にはzpool scrub、スクラブが終了するまで戻らないようにしたいのですが、それを行う方法がありません。(単純にcronを実行するのはほとんど簡単すぎるでしょうzpool scrub --wait-until-done $POOL; zpool status $POOL。)

それができない場合は、システムに、スクラブが現在進行中かどうかを確認します。できれば、アップグレードまたは構成の変更によってリスクが大幅に低下しないようにして、以前に実行されているかどうかを確認できるようにします。スクラブが終了しました(スクラブステータスがスクラブから非スクラブに変わったときにzpoolステータスを実行することにより)。

この特定のセットアップはワークステーションシステム用であるため、Nagiosなどの監視ツールには問題を解決するアドインが含まれている可能性がありますが、この1つのタスクだけにこのようなツールをインストールするのはやり過ぎです。誰かが問題に対するより低い技術の解決策を提案できますか?

回答:


13

上のZFS上のLinuxで始まるバージョン0.6.3これを使用することにより、非常にエレガントに扱うことができる(ZED)ZFSイベントデーモン。イベントデーモンは、カーネルイベントを直接監視することにより、発生するイベントにほぼ即座に対応でき、他のコマンドの出力の継続的なポーリングと解析に依存しません。

で始まる任意のファイル名でシェルスクリプトを作成します/etc/zfs/zed.d/scrub.finish(たとえば、scrub.finish-custom.sh)。そのスクリプトは、電子メールの送信、どこかにログエントリの書き込み、システムの歌と踊りの作成など、適切なアクションを実行できます(OK、多分そうではありません)。開始点を提供できる例が提供されます。

スクラブが完了したときに電子メールを受信したいだけの場合は、提供されたscrub.finish-email.shスクリプトがそれをうまく実行します。電子メールが送信されるべき場所に、プールがすべての問題を経験していない場合は、メールでも送信されるべきかどうかを示すために、単純に編集/etc/zfs/zed.d/zed.rcは、必ず何かがという名前にするscrub.finishには/ etc何でも続きます/zfs/zed.dがそれにつながり、ブート時にzedが開始されていることを確認します。


現在の実装については、wiki.archlinux.org / index.php / ZFS
Stuart Cardallを

3

この質問はLinuxに固有ですが、「スクラブが完了するまで待機する」を検索したときの最初のgoogleの結果なので、OpenSolarisを実行している人々に役立つ情報を追加したいと思います(OmniOSでテスト済みですが、SmartOS、illumosなど) Linuxの代わりに。

を使用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がある場合はstatezpool 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 2013

@MichaelKjörlingスクリプトはwhile ... done、この状態のループチェックのためにスクラブが進行している限り終了しません。
the-wabbit 2013

このようなものが私が行く方法だと思います。ちなみに、grep -qあなたのシェルスクリプトスニペットでも動作するはずです。/dev/nullにリダイレクトする必要はありません。:)
CVn

はい、このオプションのないPOSIX grepを使ってSolaris 10でテストしました。
dsmsk80 2013

あ、そう。ただし、GNU grepには必要なセマンティクスを持つ-qがあります。
CVn

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.