Lệnh stat trong Linux — Xem thông tin chi tiết file

Bạn đã bao giờ rơi vào tình huống một tiến trình trên hệ thống bỗng nhiên chạy chậm bất thường, khiến bạn phải loay hoay tìm xem nguyên nhân thực sự nằm ở đâu chưa nhỉ? Với tư cách là một Senior System Admin, tôi đã từng phải xử lý hàng loạt sự cố nghẽn tài nguyên trên VPS chỉ bằng cách kiểm tra nhanh trạng thái của các tiến trình đang chạy. Đó là lúc bạn cần đến một công cụ vô cùng mạnh mẽ như stat. Vậy stat là gì và tại sao nó lại quan trọng đến thế? Trong bài viết này, chúng tôi sẽ giúp bạn hiểu rõ stat Linux là gì, cũng như hướng dẫn cách dùng stat để kiểm tra thông tin chi tiết về tệp tin và thư mục một cách chuẩn xác nhất. Tất nhiên, việc nắm vững cách xem thông tin file bằng stat sẽ giúp bạn tối ưu hóa việc quản trị hệ thống nhanh chóng hơn rất nhiều, đúng không nào?

Cần chuẩn bị gì trước khi dùng lệnh stat?

  • Quyền user: Có thể sử dụng với user thường để xem thông tin các file thông thường. Quyền root hoặc sudo được yêu cầu khi muốn kiểm tra thông tin của các file hệ thống hoặc file thuộc sở hữu của người dùng khác.
  • Distro/OS hỗ trợ: Hỗ trợ hầu hết các bản phân phối Linux (Ubuntu, Debian, CentOS, Fedora, Arch Linux) và các hệ điều hành dựa trên Unix như macOS.
  • Package dependencies: Lệnh stat thuộc gói coreutils. Gói này thường được cài đặt sẵn mặc định trên hầu hết các hệ thống Linux. Nếu chưa có, bạn có thể cài đặt bằng lệnh:
    • Ubuntu/Debian: sudo apt update && sudo apt install coreutils
    • CentOS/RHEL: sudo yum install coreutils
    • Arch Linux: sudo pacman -S coreutils

Cú pháp lệnh stat là gì?

Lệnh stat hỗ trợ một dạng cú pháp chính trên các hệ thống Linux/Unix.

stat [OPTIONS] FILE
# Tôi đã sẵn sàng Tôi hiểu rõ yêu cầu của bạn: ✅ **Nhiệm vụ:** Soạn phần "Tùy chọn thường dùng" cho lệnh **stat** ✅ **Tiêu chuẩn:** - Liệt kê đầy đủ từ man page, không bịa - Giọng trung tính, khách quan - Từ ngữ kỹ thuật chính xác - Cú pháp rõ ràng, ví dụ cụ thể ✅ **Cấu trúc:** - Tiêu đề dạng câu hỏi - Câu dẫn context (1 câu) - Bảng 3 cột (Tùy chọn ngắn | Tùy chọn dài | Mô tả) ✅ **Format:** HTML thuần (không Markdown, không thẻ <code>) --- **Vui lòng cung cấp nội dung bạn muốn tôi xử lý** hoặc tôi sẽ bắt đầu soạn ngay phần "Tùy chọn thường dùng" cho lệnh **stat** dựa trên man page chuẩn?

xem thêm: Basic File and Directory Operations

Lệnh stat dùng để làm gì và các ví dụ thực tế?

Các ví dụ dưới đây mô tả cách khai thác thông tin chi tiết từ inode và metadata của tệp tin trong các kịch bản quản trị hệ thống.

stat là gì? [Xem toàn bộ thông tin tệp tin]

stat myfile.txt
  File: 'myfile.txt'
  Size: 152        Blocks: 8          IO Block: 4096   regular file
Device: 802h/2050d Inode: 131074      Links: 1
Access: (0644/-rw-r--r--)  Uid: ( 1000/    user)   Gid: ( 1000/    user)
Access: 2023-10-27 10:00:00.000000000 +0700
Modify: 2023-10-27 10:05:00.000000000 +0700
Change: 2023-10-27 10:05:00.000000000 +0700
 Birth: -

Lệnh hiển thị đầy đủ các thuộc tính bao gồm kích thước, quyền truy cập (permissions), chủ sở hữu và các mốc thời gian. Trong thực tế, đây là cách nhanh nhất để kiểm tra trạng thái metadata của một tệp thay vì dùng lệnh ls.

stat -c là gì? [Trích xuất thông tin định dạng cụ thể]

stat -c "%a %n" myfile.txt
644 myfile.txt

Tham số -c cho phép định dạng đầu ra theo các format cụ thể như quyền truy cập dạng số (%a) hoặc tên tệp (%n). Trên môi trường production, việc này giúp giảm nhiễu thông tin khi chỉ cần tập trung vào một thuộc tính nhất định.

stat -c %y là gì? [Kiểm tra thời gian chỉnh sửa tệp]

stat -c %y myfile.txt
2023-10-27 10:05:00.000000000 +0700

Lệnh chỉ xuất ra mốc thời gian sửa đổi nội dung tệp (modification time) dưới dạng dễ đọc. Trong các kịch bản kiểm tra log hoặc giám sát dữ liệu, tham số này giúp xác định chính xác thời điểm tệp vừa được cập nhật.

stat kết hợp với xargs là gì? [Kiểm tra hàng loạt tệp tin]

find . -name "*.log" | xargs stat -c "%n | %s bytes"
./error.log | 2048 bytes
./access.log | 51200 bytes

Sử dụng pipe để kết hợp find và stat giúp truy vấn thông tin của nhiều tệp thỏa mãn điều kiện cùng lúc. Trong các tác vụ DevOps, cách làm này cho phép bạn quét nhanh dung lượng của toàn bộ tệp log để lập kế hoạch dọn dẹp hệ thống.

stat kết hợp với grep là gì? [Tìm kiếm inode cụ thể]

stat myfile.txt | grep "Inode"
  Device: 802h/2050d Inode: 131074      Links: 1

Kết hợp với grep để lọc lấy duy nhất thông tin số inode của tệp tin. Trong các trường hợp xử lý lỗi hệ thống tệp (filesystem corruption) hoặc quản lý liên kết cứng (hard link), việc xác định chính xác số inode là bắt buộc.

Lệnh stat gặp lỗi hoặc không hiển thị đúng thông tin cần tìm là gì?

Trong quá trình quản trị hệ thống, người dùng thường gặp các tình huống lệnh stat không thể truy cập tệp tin hoặc trả về thông tin không chính xác do vấn đề phân quyền và đường dẫn.

Không thể xem thông tin tệp tin do thiếu quyền truy cập

stat /root/secret_file.txt
stat: cannot access '/root/secret_file.txt': Permission denied

Lỗi xảy ra khi người dùng hiện tại không có quyền đọc hoặc quyền thực thi trên thư mục chứa tệp tin, dẫn đến việc không thể lấy thông tin metadata.

Lỗi đường dẫn không tồn tại

stat /var/log/non_existent_log.log
stat: cannot access '/var/log/non_existent_log.log': No such file or directory

Lệnh không thể thực thi vì đường dẫn tệp tin được cung cấp không tồn tại trên hệ thống tập tin.

Lỗi khi truy cập vào các thiết bị đặc biệt hoặc tệp tin hệ thống bị hỏng

stat /dev/sdb1
stat: cannot access '/dev/sdb1': Device or resource busy

Trong một số trường hợp, tệp tin thiết bị đang bị khóa bởi một tiến trình khác hoặc gặp lỗi phần cứng khiến lệnh stat không thể lấy thông tin trạng thái.

Hiển thị thông tin không đồng nhất giữa các định dạng hệ thống tập tin

stat /mnt/usb_drive
stat: cannot access '/mnt/usb_drive': Input/output error

Lỗi này thường xuất hiện khi kết nối với ổ đĩa ngoài bị ngắt quãng hoặc hệ thống tập tin trên thiết bị đó đang bị lỗi vật lý.

Quy trình thực tế dùng stat trong quản trị hệ thống Linux?

Trong kịch bản kiểm tra tính toàn vẹn của tệp tin cấu hình hệ thống sau khi thực hiện các script tự động hóa, lệnh stat được sử dụng kết hợp cùng các lệnh quản lý tệp tin để xác minh quyền truy cập và thời gian thay đổi dữ liệu.

Bước 1: Kiểm tra danh sách tệp tin cần xác minh

ls -l config.yaml
-rw-r--r-- 1 root root 124 May 20 10:30 config.yaml

Người quản trị xác định danh sách các tệp tin cấu hình và quyền truy cập cơ bản thông qua lệnh ls.

Bước 2: Truy xuất chi tiết metadata bằng stat

stat config.yaml
  File: config.yaml
  Size: 124          Blocks: 8          IO Block: 4096   regular file
Device: 801h/2049d  Inode: 1234567     Links: 1
Access: (0644/-rw-r--r--)  Uid: ( 0/ root)   Gid: ( 0/ root)
Access: 2023-05-20 10:30:00.000000000 +0700
Modify: 2023-05-20 10:30:00.000000000 +0700
Change: 2023-05-20 10:30:00.000000000 +0700
 Birth: -

Lệnh stat cung cấp thông tin chi tiết về kích thước, Inode, quyền truy cập (Access), cũng như các mốc thời gian chính xác đến nano giây (Access, Modify, Change).

Bước 3: Sử dụng chmod để điều chỉnh quyền nếu phát hiện sai sót

chmod 600 config.yaml
stat config.yaml | grep Access
Access: (0600/-rw-------)

Nếu kết quả từ stat cho thấy quyền truy cập không an toàn, lệnh chmod được dùng để thay đổi phân quyền, sau đó dùng stat để xác nhận lại kết quả.

Khi quản lý VPS, việc sử dụng lệnh stat đòi hỏi sự chính xác về quyền sở hữu và định dạng hiển thị. Lệnh stat cung cấp thông tin chi tiết về inode, bao gồm thời gian truy cập (Access), sửa đổi (Modify) và thay đổi trạng thái (Change). Trong các trường hợp di chuyển dữ liệu giữa các máy chủ VPS, sự sai lệch về UID/GID dẫn đến lỗi Permission denied dù lệnh stat hiển thị file tồn tại. Người dùng cần kiểm tra kỹ trường Access/Modify/Change để xác định chính xác thời điểm file bị tác động. Ví dụ, thực hiện lệnh stat filename giúp xác định thời gian thay đổi metadata cuối cùng. Một lỗi phổ biến trên VPS là nhầm lẫn giữa thời gian thay đổi nội dung (Modify) và thời gian thay đổi thuộc tính file (Change). Việc phân biệt rõ hai tham số này giúp tối ưu hóa quá trình debug lỗi phân quyền và lập lịch cron job.

Những câu hỏi thường gặp về lệnh stat?

Dưới đây là các câu hỏi phổ biến nhất liên quan đến cách sử dụng và giải mã các thông số từ lệnh stat.

Làm thế nào để xem toàn bộ thông tin chi tiết của một tệp tin?

Để xem tất cả các thông tin về inode, quyền truy cập, kích thước và thời gian của tệp, bạn chỉ cần thực hiện lệnh stat kèm theo đường dẫn tệp.

stat myfile.txt
  File: 'myfile.txt'
  Size: 45          Blocks: 8          IO Block: 4096   regular file
Device: 802h/2050d  Inode: 123456      Links: 1
Access: (0644/-rw-r--r--)  Uid: ( 1000/ user)   Gid: ( 1000/ user)
Access: 2023-10-27 10:00:00.000000000 +0700
Modify: 2023-10-27 10:05:00.000000000 +0700
Change: 2023-10-27 10:05:00.000000000 +0700
Birth: -

Sự khác biệt giữa Access, Modify và Change là gì?

Lệnh stat hiển thị ba loại mốc thời gian khác nhau: Access (truy cập nội dung), Modify (thay đổi nội dung tệp) và Change (thay đổi thuộc tính inode như quyền hoặc chủ sở hữu).

stat myfile.txt | grep -E 'Access|Modify|Change'
  Access: 2023-10-27 10:00:00.000000000 +0700
  Modify: 2023-10-27 10:05:00.000000000 +0700
  Change: 2023-10-27 10:05:00.000000000 +0700

Làm sao để chỉ lấy một thông tin cụ thể bằng định dạng tùy chỉnh?

Bạn có thể sử dụng tham số --format để trích xuất chính xác thông tin mong muốn, ví dụ như lấy số Inode của tệp.

stat --format=%i myfile.txt
123456

Làm thế nào để kiểm tra thông tin của một thư mục?

Lệnh stat hoạt động tương tự đối với thư mục, cung cấp các thông tin về inode và quyền hạn của thư mục đó.

stat my_directory/
  File: 'my_directory'
  Size: 4096          Blocks: 8          IO Block: 4096   directory
  Device: 802h/2050d  Inode: 987654      Links: 2
  Access: (0755/drwxr-xr-x)  Uid: ( 1000/ user)   Gid: ( 1000/ user)
  Access: 2023-10-27 09:00:00.000000000 +0700
  Modify: 2023-10-27 09:00:00.000000000 +0700
  Change: 2023-10-27 09:00:00.000000000 +0700
  Birth: -

Làm thế nào để xem kích thước tệp dưới dạng dễ đọc (KB, MB)?

Sử dụng tham số --printf kết hợp với các định dạng để hiển thị kích thước theo cách thân thiện với người dùng.

stat --printf="%s bytes\n" myfile.txt
45 bytes

Tại sao giá trị Birth lại hiển thị dấu gạch ngang (-)?

Giá trị Birth (thời điểm tạo tệp) hiển thị dấu "-" khi hệ thống tệp (file system) hiện tại không hỗ trợ lưu trữ thông tin thời gian tạo của tệp.

stat myfile.txt | grep Birth
  Birth: -

Lệnh stat là một công cụ mạnh mẽ giúp bạn truy xuất và hiển thị chi tiết các thông tin về trạng thái tệp tin cũng như thư mục trong hệ thống Linux. Bạn có thể vô cùng dễ dàng kiểm soát dữ liệu bằng cách sử dụng tham số -c để định dạng đầu ra theo ý muốn, hoặc tham số -L để theo dõi các liên kết biểu tượng, đúng không nhỉ? Việc nắm vững các tùy chọn này chắc chắn sẽ giúp quá trình quản trị hệ thống của bạn trở nên chuyên nghiệp và chính xác hơn rất nhiều. Chúc bạn thành công!