Tôi có một thư mục với các bản ghi sự cố và tôi muốn sử dụng một câu lệnh có điều kiện trong tập lệnh bash dựa trên lệnh find.
Các tệp nhật ký được lưu trữ ở định dạng này:
/var/log/crashes/app-2012-08-28.log
/var/log/crashes/otherapp-2012-08-28.log
Tôi muốn câu lệnh if chỉ trả về true nếu có nhật ký sự cố cho một ứng dụng cụ thể đã được sửa đổi trong 5 phút qua. Các find
lệnh mà tôi sẽ sử dụng là:
find /var/log/crashes -name app-\*\.log -mmin -5
Tôi không chắc làm thế nào để kết hợp nó vào một if
tuyên bố đúng. Tôi nghĩ rằng điều này có thể làm việc:
if [ test `find /var/log/crashes -name app-\*\.log -mmin -5` ] then
service myapp restart
fi
Có một vài lĩnh vực mà tôi không rõ ràng:
- Tôi đã xem các cờ if nhưng tôi không chắc nên sử dụng cái nào, nếu có, mà tôi nên sử dụng.
- Tôi có cần
test
chỉ thị hay tôi chỉ nên xử lý trực tiếp kết quả của lệnh find hoặc có thể sử dụngfind... | wc -l
để lấy số đếm dòng thay thế? - Không phải 100% cần thiết để trả lời câu hỏi này, nhưng
test
là để kiểm tra mã trả về mà lệnh trả về? Và chúng là loại vô hình - bên ngoàistdout
/stderr
? Tôi đọcman
trang này nhưng tôi vẫn chưa rõ về thời điểm sử dụngtest
và cách gỡ lỗi.
... -exec command ';' -quit
, nhưng tôi không tin có bất kỳ giải pháp nào cho cái sau ngoài việc phân tích kết quả. Ngoài ra, trong cả hai trường hợp, vấn đề chính với việc phân tích kết quả của find
(nghĩa là không thể phân biệt các dấu phân cách với các ký tự trong tên tệp) không được áp dụng, vì bạn không cần phải tìm các dấu phân cách trong các trường hợp này.
find ... -exec
. Cũng xem các lệnh ví dụ bên dưới Tại sao lặp đi lặp lại thực tiễn xấu của đầu ra?