Nếu mọi thứ trong Linux là một file, bạn sẽ có nhiều thứ hơn ngoài file trên ổ cứng. Bài viết này sẽ hướng dẫn bạn cách sử dụng lệnh lsof xem tất cả các thiết bị và tiến trình khác được xử lý như một file.
- Những lệnh Linux cơ bản ai cũng cần biết
- 7 lệnh thao tác với các file và thư mục cơ bản nhất ai cũng phải biết
- Tìm kiếm file và thư mục trong Linux sử dụng giao diện dòng lệnh
Trên Linux, mọi thứ đều là một file
Nhận định mọi thứ trên Linux đều là một file khá đúng. Một file là tập hợp các byte. Khi được đọc trong một chương trình hoặc được gửi cho máy in, chúng tạo ra một luồng byte. Và khi được ghi, chúng chấp nhận một luồng byte.
Nhiều thành phần hệ thống khác chấp nhận hoặc tạo luồng byte như bàn phím, máy in, tiến trình giao tiếp. Bởi vì chúng vừa chấp nhận và vừa tạo luồng byte cho nên các thiết bị này có thể được xử lý như thể chúng là một file với mức độ rất thấp.
Khái niệm trên đã đơn giản hóa việc triển khai hệ điều hành Linux. Điều đó có nghĩa là một bộ xử lý các công cụ, API có thể được tạo để xử lý một loạt các tài nguyên khác nhau.
Dữ liệu và file chương trình nằm trên ổ cứng là các file hệ thống cũ. Bạn có thể sử dụng lệnh ls để liệt kê và tìm thông tin về chúng.
Vậy làm thế nào để chúng ta tìm ra tất cả các tiến trình và thiết bị khác được xem là file? Hãy để lệnh lsof xử lý việc đó. Lệnh này sẽ liệt kê các file mở trên hệ thống và bất cứ thứ gì được xử lý như một file.
Lệnh lsof
Chúng ta cần sử dụng lệnh sudo với lệnh lsof vì nhiều tiến trình hoặc thiết bị thuộc về root hoặc được khởi chạy bởi root.
Danh sách lệnh lsof liệt kê rất dài, do đó bạn cũng nên sử dụng lệnh less để rút ngắn lại.
sudo lsof | less
Khi chạy lệnh lsoft trên GNOME, người dùng sẽ nhận cảnh báo trong cửa sổ terminal.
lsof: WARNING: can't stat() fuse.gvfsd-fuse file system /run/user/1000/gvfs
Output information may be incomplete.
Lsoft cố gắng xử lý tất cả các hệ thống file. Cảnh báo này xuất hiện là do lsof gặp phải hệ thống GNOME Virtual file system (GVFS). Đây là trường hợp đặc biệt của hệ thống file trong không gian người dùng (FUSE). Nó hoạt động như một cầu nối giữa GNOME, API và nhân kernel. Không ai, thậm chí cả những người có quyền root có thể truy cập vào những hệ thống file này trừ người đã mount nó (trong trường hợp này là GNOME). Bạn có thể bỏ qua cảnh báo này.
Đầu ra của lsof rất dài và nhiều. Bạn có thể thấy các cột ngoài cùng bên trái ở hình dưới:
Các cột ngoài cùng bên phải:
Các cột trong lệnh lsof
Dưới đây là các cột đầy đủ của lệnh lsoft. Các file mở có thể không có đầy đủ các cột, một số sẽ bỏ trống.
- Command: Tên của lệnh liên quan đến tiến trình mở file.
- PID: Mã định danh tiến trình của tiến trình mở file.
- TID: Mã định danh nhiệm vụ (luồng). Nếu thấy cột trống có nghĩa nó không phải là nhiệm vụ mà là tiến trình.
- User: ID hoặc tên người dùng thuộc về tiến trình hoặc ID người dùng, thông tin đăng nhập của người sở hữu thư mục trong /proc mà lsoft tìm thấy thông tin về tiến trình.
- FD: Hiển thị mô tả file.
- Type: Loại nút liên kết với file.
- Device: Chứa số thiết bị được tách nhau bằng dấu phẩy cho một ký tự đặc biệt, chặc file đặc biệt, thông thường, thư mục hoặc file NFS, địa chỉ tham chiếu kernel xác định file. Ngoài ra, nó còn hiển thị địa chỉ cơ sở hoặc tên thiết bị của thiết bị Linux AX.25 socket.
- Size/Off: Hiển thị kích thước file hoặc khoảng cách đến đầu file (file offset) tính bằng byte.
- Node: Hiển thị số node của file cục bộ hoặc số inode của file NFS trong máy chủ lưu trữ hoặc loại giao thức Internet. Nó có thể hiển thị STR cho một luồng hoặc số inode, IRQ cho thiết bị Linux AX.25 socket.
- Name: Hiển thị tên của điểm mount và hệ thống file có các file nằm trên đó.
Cột FD
Mục cột FD có thể được tạo thành từ ba thành phần: mô tả file, ký tự node và ký tự khóa. Một số mô tả file phổ biến là:
- cwd: Thư mục làm việc hiện tại.
- err: Lỗi thông tin FD (xem cột NAME).
- ltx: Văn bản thư viện dùng chung (mã và dữ liệu).
- m86: Tập tin ánh xạ DOS Merge.
- mem: Tập tin ánh xạ bộ nhớ.
- mmap: Thiết bị ánh xạ bộ nhớ.
- pd: Thư mục cha.
- rtd: thư mục gốc.
- txt: Văn bản chương trình (mã và dữ liệu).
Ký tự node:
- r: Truy cập đọc.
- w: Truy cập ghi.
- u: Quyền truy cập đọc và ghi.
- '': Một ký tự khoảng trắng, nếu không xác định chế độ, không có ký tự khóa.
- -: Chế độ không xác định và có một ký tự khóa.
Ký tự khóa:
- r: Khóa đọc trên một phần của tập tin.
- R: Khóa đọc trên toàn bộ tập tin.
- w: Khóa ghi trên một phần của tập tin.
- W: Khóa ghi trên toàn bộ tập tin.
- u: Khóa đọc và ghi có độ dài bất kỳ.
- U: Loại khóa không xác định.
- '': Một ký tự khoảng trắng. Không khóa.
Cột TYPE
Có hơn 70 mục có thể xuất hiện trong cột TYPE. Một số mục phổ biến bạn sẽ thấy là:
- REG: Tập tin hệ thống thường xuyên.
- DIR: Thư mục.
- FIFO: First In First Out.
- CHR: File ký tự đặc biệt.
- BLK: File bị chặn đặc biệt.
- INET: Internet socket
- unix: Socket tên miền UNIX
Xem các tiến trình mở file
Để xem các tiến trình mở một file nhất định, bạn cần cung cấp tên file làm tham số cho lsof. Ví dụ, để xem tiến trình mở file kern.log sử dụng lệnh sau:
sudo lsof /var/log/kern.log
Lsof trả lại bằng cách hiển thị tiến trình duy nhất, rsyslogd được khởi động bởi người dùng syslog.
Xem tất cả các file được mở từ thư viện
Để xem các file được mở từ một thư viện và tiến trình mở chúng, cung cấp tên thư mục cho lsof làm tham số. Bạn phải sử dụng tùy chọn +D.
Để xem tất cả các file mở trong thư mục /var/log/ sử dụng lệnh sau:
lsof trả lại một danh sách tất cả các file mở trong thư mục đó.
Để xem tất cả các file được mở từ thư mục /home, sử dụng lệnh sau:
sudo lsof +D /home
Bạn sẽ thấy tất cả các file được mở trong thư mục /home. Với mô tả ngắn trong một số cột, toàn bộ danh sách sẽ được thu hẹp.
Liệt kê file được một tiến trình cụ thể mở
Để xem các file được mở bởi một tiến trình cụ thể, sử dụng tùy chọn -c. Lưu ý, bạn có thể cung cấp nhiều thuật ngữ tìm kiếm cho lsoft cùng một lúc.
sudo lsof -c ssh -c init
Lsoft cung cấp danh sách các file được mở bởi các tiến trình trong dòng lệnh.
Xem các file người dùng mở
Để giới hạn hiển thị file được mở bởi người dùng cụ thể, bạn nên sử dụng tùy chọn -u. Trong ví dụ này, chúng ta sẽ tìm các file được mở bởi tiến trình thuộc sở hữu hoặc khởi chạy thay cho người dùng Mary.
sudo lsof -u mary
Tất cả các file được mở bởi người dùng Mary sẽ được liệt kê. Nó bao gồm các file được mở trong môi trường desktop hoặc đơn giản là kết quả của việc Mary đã đăng nhập vào hệ thống.
Loại trừ file được người dùng mở
Để loại trừ file được người dùng mở, sử dụng toán tử ^ để loại trừ người dùng ra khỏi danh sách. Điều này sẽ giúp bạn tìm thấy thông tin dễ dàng hơn. Bạn phải sử dụng tùy chọn -u và thêm ký tự ^ trước tên người dùng.
sudo lsof +D /home -u ^mary
Bạn sẽ thấy danh sách liệt kê thư mục /home không có bất cứ file nào do người dùng Mary mở.
Liệt kê file do tiến trình mở theo ID tiến trình
Để liệt kê file do tiến trình mở, sử dụng tùy chọn -p và cung cấp ID tiến trình làm tham số.
sudo lsof - p 4610
Tất cả các file được mở bởi ID tiến trình bạn cung cấp đều được liệt kê trong ảnh bên dưới.
Liệt kê ID tiến trình mở file
Để xem ID tiến trình mở file cụ thể, sử dụng tùy chọn -t và cung cấp tên file cho dòng lệnh.
sudo lsof -t /usr/share/mime/mime.cache
ID tiến trình được hiển thị trong danh sách đơn giản.
Sử dụng tìm kiếm AND và OR
Như đã đề cập ở trên, bạn có thể sử dụng nhiều thuật ngữ tìm kiếm trong dòng lệnh. Ví dụ, để tìm các file do người dùng Mary mở và có liên quan đến tiến trình SSH sử dụng lệnh sau:
sudo lsof -u mary -c ssh
Dưới đây là đầu ra của lệnh trên, có thứ gì đó không đúng ở đây vì có những mục đầu ra được bắt đầu bằng root.
Khi cung cấp nhiều thuật ngữ tìm kiếm lsoft sẽ trả lại bất cứ file nào phù hợp với thuật ngữ tìm kiếm đầu tiên, thứ hai, thứ ba, v.v… Nói một cách khác, nó thực hiện tìm kiếm OR.
Để khiến lsoft thực hiện tìm kiếm AND, sử dụng tùy chọn -a. Điều đó có nghĩa là chỉ file phù hợp với điều kiện đầu tiên và thứ hai mới được liệt kê.
sudo lsof -u mary -c ssh -a
Bây giờ, mọi file trong danh sách đều được mở bởi hoặc thay mặt bởi Mary và có liên quan đến lệnh SSH.
Tự động làm mới kết quả
Chúng ta có thể sử dụng tùy chọn +|-r để đưa lsof vào chế độ lặp lại. Bạn có thể sử dụng tùy chọn lặp lại theo hai cách +r hoặc -r. Bạn cần thêm số giây muốn lsof chờ trước khi làm mới kết quả.
Sử dụng tùy chọn lặp lại với một trong hai định dạng khiến lsoft hiển thị kết quả như bình thường nhưng nó thêm đường nét đứt vào phía dưới màn hình. Nó sẽ chờ theo đúng số giây bạn cung cấp trong dòng lệnh và sau đó làm mới màn hình với một bộ kết quả mới.
Với tùy chọn -r nó sẽ tiếp tục lặp lại quá trình, muốn dừng, nhấn Ctrl
+C
. Với định dạng +r, nó sẽ tiếp tục cho đến khi không có kết quả nào được hiển thị hoặc nhấn Ctrl
+C
.
sudo lsof -u mary -c ssh -a -r5
Lưu ý, dòng gạch đứt ở cuối danh sách chia từng phần dữ liệu được hiển thị khi đầu ra được làm mới.
Hiển thị file liên quan đến kết nối Internet.
Tùy chọn -i cho phép bạn xem các file được các tiến trình liên quan đến kết nối mạng và Internet mở.
lsof -i
Tất cả các file được mở do kết nối internet và mạng được hiển thị.
Hiển thị file được liên kết với kết nối Internet bằng ID tiến trình
Để xem các file được mở bởi tiến trình liên quan đến kết nối Internet bằng ID tiến trình trình cụ thể, hãy thêm tùy chọn -p và tùy chọn -a.
Chúng ta sẽ tìm các file liên quan đến kết nối Internet hoặc mạng do ID tiến trình 606 mở.
sudo lsof -i -a -p 606
Tất cả các file được mở bởi tiến trình ID 606 liên kết với Internet và mạng được hiển thị.
Hiển thị tập tin liên kết với các lệnh và kết nối Internet
Chúng ta có thể sử dụng tùy chọn -c (lệnh) để tìm kiếm các file được mở bởi các tiến trình cụ thể. Để tìm các file đã được mở bằng các tiến trình liên quan đến kết nối Internet hoặc mạng được liên kết với tiến trình ssh, sử dụng lệnh sau:
lsof -i -a -c ssh
Tất cả các file được mở do tiến trình ssh được liệt kê.
Hiển thị file liên quan đến kết nối Internet và cổng
Lsoft có thể báo cáo các file được mở bởi kết nối Internet và mạng trên cổng cụ thể. Để làm điều đó, sử dụng ký tự : theo sau số cổng.
Dưới đây lsoft liệt kê các file được mở bởi kết nối mạng hoặc Internet sử dụng cổng 22.
lsof -i :22
Tất cả các file được mở bởi tiến trình liên quan đến cổng 22 (đây là cổng mặc định cho kết nối SSH).
Hiển thị file liên quan đến kết nối Internet và giao thức
Bạn có thể yêu cầu lsof hiển thị file được mở bởi tiến trình liên quan đến kết nối mạng và Internet, sử dụng giao thức cụ thể. Bạn có thể chọn từ TCP, UDP và SMTP. Ở đây chúng ta tìm file sử dụng giao thức TCP.
sudo lsof -i tcp
Đây là kết quả đầu ra được mở bằng các tiến trình sử dụng giao thức TCP.
Trên đây là một số cách dùng lệnh lsoft bạn có thể sử dụng để tìm kiếm file trên Linux.
Chúc các bạn thực hiện thành công!