Saya ingin menggunakan cron untuk menjadwalkan scrub periodik dari kumpulan ZFS saya, dan pada waktu yang cukup singkat setelah scrub selesai , kirim laporan status email kepada saya sendiri. Tujuan dari ini adalah untuk menangkap masalah tanpa harus mencari mereka secara manual (dorong daripada tarik).
Bagian pertama mudah: hanya menyiapkan tugas cron untuk dijalankan zpool scrub $POOL
sebagai root pada interval apa pun yang masuk akal dalam situasi khusus saya.
Bagian kedua, saya tidak begitu yakin bagaimana melakukannya. zpool scrub
kembali segera dan kemudian scrub dijalankan di latar belakang oleh sistem (yang tentunya merupakan perilaku yang diinginkan jika scrub diprakarsai oleh administrator dari terminal). zpool status
memberi saya laporan status dan keluar (dengan kode keluar 0 saat scrub sedang berjalan; belum selesai jadi saya tidak tahu apakah status keluar berubah setelah selesai, tapi saya ragu). Satu-satunya parameter yang didokumentasikan untuk zpool scrub adalah -s
untuk "stop scrubbing".
Masalah utama adalah mendeteksi perubahan status dari scrubbing ke scrubbing jadi . Mengingat itu, sisanya harus jatuh pada tempatnya.
Idealnya, saya ingin mengatakan zpool scrub
untuk tidak kembali sampai scrub selesai, tetapi saya tidak melihat cara untuk membuatnya melakukannya. (Itu akan membuatnya hampir terlalu mudah untuk hanya cron zpool scrub --wait-until-done $POOL; zpool status $POOL
.)
Gagal itu, saya ingin bertanya kepada sistem apakah scrub sedang dalam proses, lebih disukai dengan cara yang tidak terlalu berisiko melanggar dengan perubahan upgrade atau konfigurasi, sehingga saya bisa bertindak apakah sudah berjalan sebelumnya atau tidak scrub telah selesai (dengan menjalankan status zpool ketika status scrub berubah dari menggosok menjadi tidak menggosok).
Penyiapan khusus ini untuk sistem workstation, jadi sementara alat pemantauan seperti Nagios mungkin memiliki peralatan tambahan yang akan menyelesaikan masalah, rasanya agak sulit untuk menginstal alat seperti itu untuk tugas yang satu ini saja. Dapatkah seseorang menyarankan solusi berteknologi rendah untuk masalah tersebut?
sumber
Walaupun pertanyaan ini khusus untuk linux, ini adalah hasil google pertama ketika mencari "tunggu sampai scrub selesai" , oleh karena itu saya ingin menambahkan beberapa informasi yang berguna untuk orang yang menjalankan OpenSolaris (mengujinya di OmniOS, tetapi SmartOS, illumos dll. harus mirip) daripada Linux (Solaris normal juga harus berfungsi, tapi saya tidak mengujinya di sana).
Anda dapat menggunakannya
syseventadm
untuk mendaftarkan acara kernel. Daftar lengkap dapat ditemukan di/usr/include/sys/sysevent/eventdefs.h
(cukup cari "ZFS" di file ini). Setelah menambahkan acara, layanan harus dihidupkan ulang, misalnya:Dengan cara ini, skrip akan dimulai ketika penggosokan kumpulan apa pun selesai - Anda harus memeriksa di dalam skrip jika
$1
sama dengan nama kumpulan yang Anda inginkan. Tetap saja, ini jauh lebih murah daripada polling.sumber
Saya menggunakan skrip sederhana ini untuk menggosok pelaporan status melalui email.
Jika Anda perlu mendeteksi transisi dari
scrub running
kescrub finished
Saya akan memeriksastate
bidangzpool status
output. Sesuatu seperti ini:sumber
while ... done
loop memeriksa kondisi ini.grep -q
harus berfungsi juga dalam cuplikan skrip shell milik Anda, meniadakan kebutuhan untuk mengarahkan ke / dev / null. :)Saya telah banyak sukses dengan zfswatcher
sumber