Cách sử dụng lệnh Isof trên Linux

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.

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

Sử dụng với lệnh less để rút ngắn kết quả đầu ra

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 đầu ra ngoài cùng bên trái

Các cột ngoài cùng bên phải:

Cách cột đầu ra 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

Xem tiến tình mở file 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.

Đầu ra tiến tình mở file kern.log

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:

Lệnh tìm các file mở trong thư mục /var/log/

lsof trả lại một danh sách tất cả các file mở trong thư mục đó.

Các file mở trong thư mục /var/log/

Để xem tất cả các file được mở từ thư mục /home, sử dụng lệnh sau:

sudo lsof +D /home

Lệnh tìm file được mở từ thư mục /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.

Kết quả các file được mở từ thư mục /home

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

Lệnh tìm file được một tiến trình cụ thể mở

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.

Đầu ra lệnh tìm các file được mở bởi tiến trình cụ thể

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

Lệnh tìm file được mở bởi người dùng cụ thể

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. 

Danh sách các file được mở bởi Mary

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

Loại trừ người dùng cụ thể

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ở.

Danh sách file không do người dùng cụ thể 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ìm file do tiến trình mở theo ID

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.

Danh sách file được mở bởi ID tiến trình

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

Lệnh liệt kê ID tiến trình mở file

ID tiến trình được hiển thị trong danh sách đơn giản.

ID tiến trình mở file

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

Tìm kiếm file do người dùng Mary mở và liên quan đến tiến trình 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.

Đầu ra lệnh trên có kết quả 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

Sử dụng thêm tùy chọn -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.

Dánh sách file được mở bởi Mary và 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ệnh làm mới kết quả

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.

Làm mới kết quả đầu ra

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

Lệnh tìm kiếm file liên quan đến kết nối Internet

Tất cả các file được mở do kết nối internet và mạng được hiển thị.

Kết quả các file liên quan đến kết nối Internet

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

Lệnh tìm file do ID tiến trình 606 mở

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ị.

Đầu ra các file được mở bởi tiến trình có ID 606

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

Lệnh tìm file liên quan đến kết nối Internet và tiến trình ssh

Tất cả các file được mở do tiến trình ssh được liệt kê.

Cách file do tiến trình SSH mở

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

Lệnh tìm file được mở bởi kết nối Internet trên cổng 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).

Tất cả các file được mở bởi tiến trình liên quan đến cổng 22

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

Lệnh tìm các file được mở bởi tiến trình liên quan đến kết nối Internet trên giao thức 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.

Danh sách các file được mở bởi tiến trình liên quan đến kết nối Internet trên 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! 

Thứ Bảy, 29/06/2019 09:32
54 👨 112