ZFS スクラブが *完了* したらコマンドを実行するにはどうすればよいでしょうか?

ZFS スクラブが *完了* したらコマンドを実行するにはどうすればよいでしょうか?

cronを使用してZFSプールの定期的なスクラブをスケジュールし、適度に短い時間で実行したい。スクラブが終わった後、ステータス レポートを自分に電子メールで送信します。この目的は、手動で探すことなく問題を検出することです (プルではなくプッシュ)。

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

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

主な問題は、こすり洗い洗浄終了そう考えると、残りはうまくいくはずです。

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

それができない場合は、アップグレードや構成の変更によって中断されるリスクがあまりない方法で、現在スクラブが進行中かどうかをシステムに問い合わせて、以前実行していたスクラブが終了したかどうかに応じて対処できるようにします (スクラブ ステータスがスクラブ中からスクラブ中でない状態に変わったときに zpool status を実行します)。

この特定の設定はワークステーションシステム用なので、Nagiosなどの監視ツールはおそらく問題を解決するアドインがありますが、この 1 つのタスクのためだけにそのようなツールをインストールするのはやりすぎのように感じます。この問題に対する、より低技術の解決策を提案してくれる人はいませんか?

答え1

の上Linux 上の ZFS、 で始まりますバージョン 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 を編集して、電子メールの送信先と、プールに問題が発生していない場合にも電子メールを送信するかどうかを指定します。/etc/zfs/zed.dscrub.finish内の何かが続く名前がそのプールにつながることを確認し、起動時に zed が起動することを確認します。

答え2

この質問はLinuxに特有のものですが、検索するとGoogleの最初の結果になります。「スクラブが完了するまで待機します」したがって、Linux (通常の Solaris でも動作するはずですが、そこではテストしていません) ではなく、OpenSolaris (OmniOS でテストしましたが、SmartOS、illumos などでも同様のはずです) を実行している人に役立つ情報を追加したいと思います。

カーネル イベントを登録するために使用できますsyseventadm。完全なリストは (このファイルで「ZFS」を検索するだけで) にあります/usr/include/sys/sysevent/eventdefs.h。イベントを追加した後、サービスを再起動する必要があります。例:

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

この方法では、プールのスクラブが終了したときにスクリプトが開始されます。スクリプト内で、$1目的のプール名と等しいかどうかを確認する必要があります。それでも、ポーリングよりもオーバーヘッドははるかに少なくなります。

答え3

電子メールによるステータス レポートのスクラブには、この簡単なスクリプトを使用します。

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

答え4

最近の ZFS バージョンでは、OP が尋ねた内容が正確に追加されました。-wつまり、戻る前にスクラブが完了するのを待つために使用します。例:

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

関連情報