Tôi có thể hình dung ra 2 cách tiếp cận để làm điều này. Bạn có thể sử dụng một vòng lặp while sẽ chạy lệnh "stat" ở một số tần số đã đặt, thực hiện kiểm tra để xem kích thước của tệp có vượt quá kích thước mong muốn của bạn không. Nếu có, sau đó gửi email. Phương pháp này ổn nhưng có thể hơi kém hiệu quả vì nó sẽ chạy lệnh "stat" bất kể có sự kiện nào trên tệp hay không, ở tần số thời gian đã đặt.
Phương pháp khác sẽ liên quan đến việc sử dụng các sự kiện hệ thống tệp mà bạn có thể đăng ký người theo dõi để sử dụng lệnh inotifywatch
.
Phương pháp # 1 - Cứ sau X giây
Nếu bạn đặt đoạn mã sau vào tập lệnh, hãy nói notify.bash
:
#!/bin/bash
file="afile"
maxsize=100 # 100 kilobytes
while true; do
actualsize=$(du -k "$file" | cut -f1)
if [ $actualsize -ge $maxsize ]; then
echo size is over $maxsize kilobytes
.... send email ....
exit
else
echo size is under $maxsize kilobytes
fi
sleep 1800 # in seconds = 30 minutes
done
Sau đó chạy nó, nó sẽ báo cáo về mọi quyền truy cập vào tệp, nếu truy cập đó dẫn đến kích thước của tệp vượt quá kích thước tối thiểu của bạn, nó sẽ kích hoạt một email được gửi và thoát. Nếu không, nó sẽ báo cáo kích thước hiện tại và tiếp tục xem tập tin.
Phương pháp # 2 - Chỉ kiểm tra ví dụ truy cập
Phương pháp hiệu quả hơn là chỉ kiểm tra tệp khi có quyền truy cập thực tế. Các loại quyền truy cập có thể khác nhau, ví dụ này tôi đang minh họa cách xem chỉ truy cập tệp, nhưng bạn chỉ có thể xem các sự kiện khác, chẳng hạn như tệp bị đóng. Một lần nữa chúng tôi sẽ đặt tên cho tệp này , notify.bash
:
#!/bin/bash
file=afile
maxsize=100 # 100 kilobytes
while inotifywait -e access "$file"; do
actualsize=$(du -k "$file" | cut -f1)
if [ $actualsize -ge $maxsize ]; then
echo size is over $maxsize kilobytes
.... send email ....
exit
else
echo size is under $maxsize kilobytes
fi
done
Chạy tập lệnh này sẽ dẫn đến kết quả đầu ra sau:
$ ./notify.bash
Setting up watches.
Watches established.
Tạo một số hoạt động trên tệp, tệp hiện báo cáo kích thước của nó như sau:
$ seq 100000 > afile
$ du -k afile
576 afile
Đầu ra của tập lệnh thông báo của chúng tôi:
afile ACCESS
size is over 100 kilobytes
Tại điểm đó nó sẽ thoát.
Gửi email
Để thực hiện hoạt động này, bạn chỉ cần làm một cái gì đó như thế này trong tập lệnh:
subject="size exceeded on file $file"
emailAddr="user@somedom.com"
mailCmd="mail -s \"$subject\" \"$emailAddrs\""
( echo ""; echo "DATE: $(date)"; ) | eval mail -s "$subject" \"$emailAddr\"
Cân nhắc
Phương pháp thứ hai vì nó sẽ hoạt động trong hầu hết các tình huống. Một trong những điều đó sẽ không xảy ra nếu tệp đã vượt quá $maxsize
khi tập lệnh được gọi và không có sự kiện nào nữa trên tệp loại access
. Điều này có thể được khắc phục bằng một kiểm tra bổ sung được thực hiện trong tập lệnh khi nó được gọi hoặc bằng cách mở rộng các sự kiện diễn ra inotifywatch
.
Người giới thiệu
inotify
là một cái gì đó mà bạn nên tìm ra.