Khi nào `ls -s` in ra 0 0


13

Tất nhiên, cách kiểm tra tiêu chuẩn nếu một tệp trống test -s FILE, nhưng một trong những khách hàng của chúng tôi đã nhận được một tập lệnh chứa các kiểm tra như thế này:

RETVAL=`ls -s ./log/cr_trig.log | awk '{print $1}'`
if test $RETVAL -ne 0
then
    echo "Badness: Log not empty"
    exit 25
fi

với tuyên bố từ nhà cung cấp rằng nó hoạt động trong hai môi trường mà họ đã thử nghiệm. Không cần phải nói, nó đã thất bại nặng nề ở cả hai nơi mà tôi đã thử nghiệm.

Vì vậy, tôi đã tò mò. Khi nào ls -sin 0cho các tập tin trống?

Đây là phát hiện của tôi cho đến nay:

  • GFS trên Linux: 4
  • ext4 trên Linux: 0
  • ZFS trên Solaris: 1
  • UFS trên Solaris: 0
  • jfs trên AIX: 0
  • VxFS trên HP-UX: 0
  • HFS trên HP-UX: 0
  • HFS trên Mac OS X: 0

Tôi chưa kiểm tra các hệ thống tập tin mạng.

Câu hỏi: Làm thế nào tôi có thể giải thích một cách tao nhã cho những người khác rằng kịch bản của họ sai ?

Theo tôi, phiên bản "chính xác" sẽ là:

if test ! -s ./log/cr_trig.log
then
    echo "Badness: Log not empty"
    exit 25
fi

5
Chỉ cần cho họ xem xét nghiệm của bạn. Bạn có dữ liệu cứng chứng minh rằng bài kiểm tra của họ không có khả năng di động, bạn cần thêm gì nữa?
Mat

Một trong những câu hỏi thú vị nhất tôi từng thấy cho đến nay trên máy chủ này. Quá xấu người ta chỉ có thể dành một điểm.
ktf

@ktf Bạn luôn có thể thưởng một tiền thưởng.
Joe

Câu trả lời:


6

Phát hiện rất thú vị. Mặc dù tôi chưa bao giờ sử dụng ls -sđể kiểm tra xem một tệp có trống hay không, tôi cũng sẽ giả sử rằng nó cũng báo cáo 0cho các tệp trống.

Đối với câu hỏi của bạn: Như Mat đã nhận xét, hãy cho họ xem kết quả kiểm tra của bạn. Để giải thích kết quả cho họ, hãy ls -sbáo cáo số lượng khối được phân bổ trong hệ thống tệp chứ không phải kích thước thực tế tính bằng byte. Rõ ràng một số triển khai hệ thống tệp phân bổ các khối ngay cả khi chúng không phải lưu trữ bất kỳ dữ liệu nào thay vì chỉ lưu trữ một con trỏ NULL trong nút.

Giải thích cho điều này có thể liên quan đến hiệu suất. Để tạo các tệp trống sẽ bị trống là một sự miễn trừ đối với việc xử lý thông thường (cách sử dụng phổ biến nhất tôi từng thấy là tạo các tệp trạng thái trong đó sự tồn tại của tệp biểu thị trạng thái nhất định của phần mềm).

Nhưng thông thường, một tệp được tạo sẽ sớm nhận được một số dữ liệu, do đó, các nhà thiết kế của một FS nhất định có thể đã giả định rằng nó trả hết để phân bổ ngay một khối dữ liệu khi tạo tệp, vì vậy khi dữ liệu đầu tiên đến thì nhiệm vụ này đã được thực hiện.

Lý do thứ hai có thể là một tập tin đã chứa dữ liệu trong quá khứ đã bị xóa. Thay vì giải phóng khối dữ liệu cuối cùng, có thể xứng đáng để giữ khối dữ liệu đó được sử dụng lại bởi cùng một tệp.

BIÊN TẬP:

Thêm một lý do nữa xuất hiện: Các hệ thống tệp nơi bạn đã tìm thấy các giá trị> 0 là ZFS , triển khai RAID + LVM + FS và GFS , một hệ thống tệp cụm. Cả hai có thể phải lưu trữ siêu dữ liệu để duy trì tính toàn vẹn của tệp không được lưu trữ trong các nút. Nó có thể được ls -stính trong các khối dữ liệu được phân bổ cho siêu dữ liệu này.


4

Không giống như hầu hết (nếu không phải tất cả) các hệ thống tệp khác, ZFS không phân bổ một mảng tĩnh của các nút. Tạo một tệp trống trên ZFS sau đó sẽ sử dụng một khối dữ liệu mới, đó là khối dữ liệu được báo cáo bởi ls -s.

Tôi nghi ngờ GFS phải lưu trữ dữ liệu đồng bộ hóa / khóa dẫn đến kết quả khác không.


2

ls -s báo cáo số lượng khối được phân bổ cho tệp, không bao gồm bất cứ thứ gì được lưu trữ trực tiếp trong mục nhập thư mục.

Trong hầu hết các trường hợp, số khối là số byte được chia cho kích thước khối tính theo byte, được làm tròn lên.

Số lượng khối có thể ít hơn số đó cho một tệp thưa . Ví dụ, trên hầu hết các hệ thống tệp, điều này sẽ tạo ra một tệp 8192 byte bao gồm 0 khối:

$ perl -e 'truncate STDOUT, 8192' >a
$ ls -l a
-rw-r--r-- 1 gilles gilles 8192 Nov  1 21:32 a
$ ls -s a
0 a

Ngược lại, số lượng khối có thể nhiều hơn nếu hệ thống tệp sắp xếp các khối cho tệp hoặc sử dụng các khối để lưu trữ siêu dữ liệu. Tôi không ngạc nhiên khi Zfs có sự tương ứng không rõ ràng giữa kích thước tệp và số lượng khối, với số lượng lớn các tính năng mà nó cung cấp và hướng của nó đối với các hệ thống tệp lớn; Tôi không biết chi tiết, nhưng số lượng khối không chỉ phụ thuộc vào kích thước của tệp mà còn phụ thuộc vào lịch sử của nó (bạn có thể có nhiều hơn một khối trong một tệp trống nếu đó là kết quả của việc cắt bớt tệp lớn hơn).

Để giải thích tại sao ls -ssai: nó không tính kích thước của tệp, nhưng số lượng phụ thuộc vào hệ thống tệp. Đó là một cách rất gián tiếp để xác định xem một tệp có trống ở vị trí đầu tiên hay không, yêu cầu một công cụ bên ngoài ( ls) và một số phân tích cú pháp; thay vào đó, họ nên sử dụng test -s, không yêu cầu phân tích cú pháp và thực hiện chính xác những gì được yêu cầu. Nếu họ nghĩ rằng đó ls -slà một cách tốt để kiểm tra xem một tập tin có trống không, thì onus nên ở trên họ để biện minh rằng nó hoạt động.

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.