Bagaimana menjalankan perintah setelah scrub ZFS * selesai *?


11

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 $POOLsebagai root pada interval apa pun yang masuk akal dalam situasi khusus saya.

Bagian kedua, saya tidak begitu yakin bagaimana melakukannya. zpool scrubkembali segera dan kemudian scrub dijalankan di latar belakang oleh sistem (yang tentunya merupakan perilaku yang diinginkan jika scrub diprakarsai oleh administrator dari terminal). zpool statusmemberi 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 -suntuk "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 scrubuntuk 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?

Jawaban:


13

Di ZFS Di Linux , dimulai dengan versi 0.6.3 ini dapat ditangani dengan cukup elegan dengan menggunakan ZFS Event Daemon (zed). Daemon peristiwa, berdasarkan pemantauan peristiwa kernel secara langsung, dapat bereaksi segera terhadap peristiwa apa pun yang terjadi dan tidak bergantung pada pemungutan suara berkelanjutan dan penguraian beberapa output perintah lain.

Buat skrip shell dengan nama file apa pun yang dimulai dengan /etc/zfs/zed.d/scrub.finish(misalnya, scrub.finish-custom.sh). Script itu dapat mengambil tindakan yang sesuai, seperti mengirim email, menulis entri log di suatu tempat, atau membuat sistem bernyanyi dan menari (OK, mungkin bukan itu). Contoh disediakan yang dapat memberikan titik awal.

Jika yang Anda inginkan adalah menerima email saat scrub selesai, scrub.finish-email.shskrip yang disediakan akan melakukannya dengan baik. Cukup edit /etc/zfs/zed.d/zed.rc untuk menunjukkan ke mana email harus dikirim dan apakah email harus dikirim juga jika pool tidak mengalami masalah, pastikan sesuatu bernama scrub.finishdiikuti oleh apa pun di / etc /zfs/zed.d mengarah ke sana, dan pastikan zed dijalankan saat boot.



3

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 syseventadmuntuk 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:

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

Dengan cara ini, skrip akan dimulai ketika penggosokan kumpulan apa pun selesai - Anda harus memeriksa di dalam skrip jika $1sama dengan nama kumpulan yang Anda inginkan. Tetap saja, ini jauh lebih murah daripada polling.


2

Saya menggunakan skrip sederhana ini untuk menggosok pelaporan status melalui email.

Jika Anda perlu mendeteksi transisi dari scrub runningke scrub finishedSaya akan memeriksa statebidang zpool statusoutput. Sesuatu seperti ini:

# 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

Saya melihat kode itu, tetapi sepertinya kode itu hanya memberi Anda status ketika skrip dijalankan. Bagaimana cara memberi tahu saya ketika status beralih dari "scrubbing" menjadi "selesai"?
CVn

@ MichaelKjörling skrip tidak akan selesai selama scrub sedang berlangsung karena while ... doneloop memeriksa kondisi ini.
the-wabbit

Saya pikir sesuatu seperti ini adalah cara saya akan pergi. Ngomong-ngomong, grep -qharus berfungsi juga dalam cuplikan skrip shell milik Anda, meniadakan kebutuhan untuk mengarahkan ke / dev / null. :)
CVn

Yap, saya mengujinya pada Solaris 10 dengan POSIX grep yang tidak memiliki opsi ini.
dsmsk80

Ah, baiklah. GNU grep memang memiliki -q dengan semantik yang diinginkan.
CVn

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.