Làm cách nào để chạy lệnh sau khi chà ZFS * hoàn thành *?


11

Tôi muốn sử dụng cron để lên lịch cho các lần tẩy trang định kỳ của nhóm ZFS của mình và trong một thời gian ngắn sau khi quá trình chà kết thúc , hãy gửi email báo cáo trạng thái cho chính tôi. Mục đích của việc này là để nắm bắt bất kỳ vấn đề nào mà không cần phải tự tìm kiếm chúng (đẩy chứ không phải kéo).

Phần đầu tiên rất dễ dàng: chỉ cần thiết lập một công việc định kỳ để chạy zpool scrub $POOLbằng root ở bất kỳ khoảng thời gian nào là hợp lý trong tình huống cụ thể của tôi.

Phần thứ hai, tôi không chắc lắm về cách làm. zpool scrubtrả về ngay lập tức và sau đó hệ thống chà được chạy trong nền bởi hệ thống (đây chắc chắn là hành vi mong muốn nếu quá trình chà được quản trị viên khởi động từ thiết bị đầu cuối). zpool statusđưa cho tôi một báo cáo trạng thái và thoát (với mã thoát 0 trong khi quá trình chà đang chạy; nó chưa kết thúc nên tôi không biết liệu trạng thái thoát có thay đổi hay không, nhưng tôi nghi ngờ điều đó). Tham số duy nhất được ghi nhận cho quá trình chà zpool là -s"dừng chà".

Vấn đề chính là phát hiện sự thay đổi trạng thái từ chà sang chà hoàn tất . Cho rằng, phần còn lại sẽ rơi vào vị trí.

Lý tưởng nhất là tôi muốn nói rằng zpool scrubđừng quay lại cho đến khi quá trình chà kết thúc, nhưng tôi không thấy cách nào để làm điều đó. (Nó sẽ làm cho nó gần như quá dễ dàng chỉ đơn giản là cron zpool scrub --wait-until-done $POOL; zpool status $POOL.)

Không hiểu điều đó, tôi muốn hỏi hệ thống xem liệu một quá trình chà hiện đang được tiến hành hay không, tốt nhất là theo cách không có quá nhiều rủi ro khi phá vỡ nâng cấp hoặc thay đổi cấu hình, để tôi có thể hành động xem có chạy hay không chà đã kết thúc (bằng cách thực hiện trạng thái zpool khi trạng thái chà chuyển từ chà sang không chà).

Thiết lập cụ thể này dành cho hệ thống máy trạm, vì vậy trong khi một công cụ giám sát như Nagios có thể có các bổ trợ sẽ giải quyết vấn đề, thì việc cài đặt một công cụ như vậy chỉ cho một nhiệm vụ này là quá mức cần thiết. Ai đó có thể đề xuất một giải pháp công nghệ thấp hơn cho vấn đề?

Câu trả lời:


13

Trên ZFS Trên Linux , bắt đầu với phiên bản 0.6.3, điều này có thể được xử lý khá thanh lịch bằng cách sử dụng ZFS Event Daemon (zed). Trình nền sự kiện, nhờ vào việc theo dõi trực tiếp các sự kiện hạt nhân, có thể phản ứng gần như ngay lập tức với bất kỳ sự kiện nào xảy ra và không phụ thuộc vào việc bỏ phiếu và phân tích cú pháp liên tục của một số lệnh đầu ra khác.

Tạo một tập lệnh shell với bất kỳ tên tệp nào bắt đầu bằng /etc/zfs/zed.d/scrub.finish(ví dụ scrub.finish-custom.sh:). Kịch bản đó có thể thực hiện bất kỳ hành động thích hợp nào, chẳng hạn như gửi email, viết một mục nhật ký ở đâu đó hoặc làm cho hệ thống hát và nhảy (OK, có thể không phải vậy). Các ví dụ được cung cấp có thể cung cấp một điểm khởi đầu.

Nếu tất cả những gì bạn muốn là nhận email khi quá trình chà hoàn thành, scrub.finish-email.shtập lệnh được cung cấp sẽ thực hiện điều đó một cách độc đáo. Chỉ cần chỉnh sửa /etc/zfs/ened.d/ened.rc để chỉ ra nơi email sẽ được gửi và liệu email có được gửi không nếu hồ bơi không gặp bất kỳ vấn đề nào, hãy đảm bảo một cái gì đó được đặt tên scrub.finishtheo bất cứ điều gì trong / etc /zfs/ened.d dẫn đến nó và đảm bảo zed được khởi động khi khởi động.


để biết cách triển khai hiện tại, hãy xem wiki.archlinux.org/index.php/ZFS#Monitoring_/_Mailing_on_Events
Stuart Cardall

3

Mặc dù câu hỏi này là dành riêng cho linux, nhưng đây là kết quả đầu tiên của google khi tìm kiếm "đợi cho đến khi quá trình hoàn tất" , do đó tôi muốn thêm một số thông tin hữu ích cho những người chạy OpenSolaris (đã thử nghiệm trên OmniOS, nhưng SmartOS, illumos, v.v. . nên tương tự) thay vì Linux (Solaris bình thường cũng sẽ hoạt động, nhưng tôi đã không kiểm tra nó ở đó).

Bạn có thể sử dụng syseventadmđể đăng ký các sự kiện kernel. Danh sách đầy đủ có thể được tìm thấy trong /usr/include/sys/sysevent/eventdefs.h(chỉ cần tìm kiếm "ZFS" trong tệp này). Sau khi thêm các sự kiện, dịch vụ phải được khởi động lại, ví dụ:

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

Bằng cách này, tập lệnh sẽ được bắt đầu khi mọi hoạt động cọ rửa của bất kỳ nhóm nào kết thúc - bạn phải kiểm tra bên trong tập lệnh nếu $1bằng với tên nhóm mong muốn của bạn. Tuy nhiên, nó là ít chi phí hơn nhiều so với bỏ phiếu.


2

Tôi sử dụng tập lệnh đơn giản này để xóa báo cáo trạng thái qua email.

Nếu bạn cần phát hiện chuyển đổi từ scrub runningsang scrub finishedtôi sẽ kiểm tra statetrường zpool statusđầu ra. Một cái gì đó như thế này:

# 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

Tôi đã xem mã, nhưng có vẻ như nó chỉ cung cấp cho bạn trạng thái khi tập lệnh được chạy. Làm thế nào nó sẽ thông báo cho tôi khi trạng thái từ "chà" đến "kết thúc"?
một CVn

@ MichaelKjorling kịch bản sẽ không hoàn thành miễn là quá trình chà đang diễn ra do while ... donekiểm tra vòng lặp cho chính điều kiện này.
the-wợi

Tôi nghĩ rằng một cái gì đó như thế này là con đường tôi sẽ đi. Nhân tiện, grep -qcũng nên hoạt động trong đoạn mã shell đó của bạn, phủ nhận sự cần thiết phải chuyển hướng đến / dev / null. :)
một CVn

Đúng, tôi đã thử nghiệm nó trên Solaris 10 với POSIX grep thiếu tùy chọn này.
dsmsk80

À, được rồi GNU grep có -q với ngữ nghĩa mong muốn, mặc dù.
một CVn

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.