Linux lsof command

Lệnh lsof trong Linux: "Cửa sổ" nhìn vào thế giới file đang mở

Bạn đã bao giờ tự hỏi tiến trình nào đang sử dụng một file cụ thể trên hệ thống Linux của mình? Hoặc đơn giản hơn, bạn muốn biết cổng mạng nào đang được một ứng dụng nào đó "lắng nghe"? Lệnh lsof (List Open Files) chính là công cụ bạn cần. Nó cung cấp một cái nhìn sâu sắc và chi tiết về tất cả các file đang mở trên hệ thống, từ file thông thường, thư mục, socket mạng cho đến các thiết bị.

Trong bài viết này, chúng ta sẽ cùng nhau khám phá sức mạnh của lsof, tìm hiểu cách sử dụng nó để giải quyết các vấn đề thường gặp trong quá trình quản trị hệ thống và phát triển ứng dụng. Chúng ta sẽ đi từ những lệnh cơ bản đến những ví dụ phức tạp hơn, đảm bảo bạn có thể tự tin sử dụng lsof để làm chủ hệ thống Linux của mình.

lsof là gì và tại sao nó lại quan trọng?

lsof là một công cụ dòng lệnh mạnh mẽ, cho phép bạn liệt kê tất cả các file đang mở trên hệ thống Linux. Hiểu một cách đơn giản, mỗi khi một tiến trình mở một file (ví dụ: một ứng dụng đọc dữ liệu từ một file cấu hình, một trình duyệt web kết nối đến một máy chủ từ xa thông qua socket), thông tin này sẽ được hệ thống ghi lại. lsof truy cập vào thông tin này và hiển thị cho bạn một cách rõ ràng.

Tại sao điều này lại quan trọng? Có rất nhiều tình huống mà lsof trở nên vô giá:

  • Gỡ lỗi ứng dụng: Khi ứng dụng gặp sự cố, bạn có thể sử dụng lsof để xác định xem nó có đang truy cập đúng file hay không, hoặc có đang giữ một file nào đó mà nó không nên giữ hay không.
  • Quản lý tài nguyên: Bạn có thể sử dụng lsof để theo dõi các tiến trình đang sử dụng nhiều tài nguyên (ví dụ: nhiều file, nhiều socket mạng), giúp bạn phát hiện và giải quyết các vấn đề về hiệu suất.
  • Bảo mật: Bạn có thể sử dụng lsof để kiểm tra xem có tiến trình nào đang truy cập các file nhạy cảm mà không được phép hay không.
  • Xử lý xung đột: Khi bạn không thể xóa hoặc sửa đổi một file, lsof có thể giúp bạn tìm ra tiến trình nào đang sử dụng file đó, cho phép bạn tắt tiến trình đó và giải phóng file.

Cú pháp cơ bản của lệnh lsof

Cú pháp cơ bản của lệnh lsof rất đơn giản:

lsof [options] [file...]

Trong đó:

  • options: Các tùy chọn để điều chỉnh hành vi của lệnh lsof.
  • file...: Một hoặc nhiều file mà bạn muốn tìm kiếm. Nếu bạn không chỉ định file nào, lsof sẽ liệt kê tất cả các file đang mở trên hệ thống.

Các tùy chọn quan trọng của lệnh lsof

lsof có rất nhiều tùy chọn, nhưng dưới đây là một số tùy chọn quan trọng nhất mà bạn nên biết:

  • -i [46][protocol][@hostname|hostaddr][:service|portnumber]: Lọc kết quả theo kết nối mạng. Ví dụ: lsof -i TCP:80 sẽ hiển thị tất cả các tiến trình đang sử dụng cổng 80 (thường là HTTP). Bạn có thể sử dụng TCP hoặc UDP cho protocol. Bạn cũng có thể lọc theo địa chỉ IP hoặc tên máy chủ.
  • -p s: Hiển thị file được mở bởi tiến trình có ID là 's'. Ví dụ: lsof -p 1234 sẽ hiển thị tất cả các file mà tiến trình có ID 1234 đang mở.
  • -u user: Hiển thị các file được mở bởi người dùng 'user'. Ví dụ: lsof -u www-data sẽ hiển thị tất cả các file mà người dùng www-data đang mở (thường là tiến trình web server).
  • -c string: Liệt kê các file được mở bởi các lệnh có tên bắt đầu bằng chuỗi 'string'. Ví dụ: lsof -c apache sẽ liệt kê tất cả các file được mở bởi các tiến trình có tên bắt đầu bằng 'apache'.
  • -d fd: Chỉ hiển thị các file được mở trên các file descriptor (fd) được chỉ định. Ví dụ: lsof -d 1,2 sẽ chỉ hiển thị các file được mở trên stdout (fd 1) và stderr (fd 2).
  • +D directory: Tìm tất cả các file nằm trong thư mục chỉ định. Điều này rất hữu ích để tìm ra những file nào trong một thư mục cụ thể đang được sử dụng. Ví dụ: lsof +D /var/log
  • -t: Chỉ hiển thị ID tiến trình (PID). Tùy chọn này rất hữu ích khi bạn muốn sử dụng lsof trong một script và chỉ cần lấy PID của các tiến trình đang sử dụng một file cụ thể.
  • +m: Hiển thị thông tin về các file được ánh xạ bộ nhớ (memory-mapped files).

Ví dụ thực tế sử dụng lệnh lsof

Để hiểu rõ hơn về cách sử dụng lsof, chúng ta hãy xem xét một vài ví dụ thực tế:

  1. Tìm tiến trình đang sử dụng một file cụ thể:

    Giả sử bạn muốn biết tiến trình nào đang sử dụng file /var/log/syslog. Bạn có thể sử dụng lệnh:

    lsof /var/log/syslog

    Kết quả sẽ hiển thị thông tin chi tiết về tiến trình (PID, tên tiến trình, người dùng sở hữu tiến trình,...) đang sử dụng file này.

  2. Tìm tiến trình đang lắng nghe trên một cổng cụ thể:

    Giả sử bạn muốn biết tiến trình nào đang lắng nghe trên cổng 8080. Bạn có thể sử dụng lệnh:

    lsof -i :8080

    Hoặc cụ thể hơn, bạn muốn biết tiến trình nào đang lắng nghe trên cổng 8080 sử dụng giao thức TCP:

    lsof -i TCP:8080

    Kết quả sẽ hiển thị thông tin về tiến trình và giao thức sử dụng.

  3. Tìm tất cả các file mà một người dùng cụ thể đang mở:

    Giả sử bạn muốn biết tất cả các file mà người dùng john đang mở. Bạn có thể sử dụng lệnh:

    lsof -u john

    Kết quả sẽ hiển thị tất cả các file mà người dùng john đang sử dụng.

  4. Tìm tất cả các file trong một thư mục cụ thể đang được mở:

    Giả sử bạn muốn biết file nào trong thư mục /home/john/documents đang được mở. Bạn có thể sử dụng lệnh:

    lsof +D /home/john/documents

Bảng so sánh một số lệnh tương đương với lsof

Lệnh Mô tả Ưu điểm Nhược điểm
lsof Liệt kê tất cả các file đang mở trên hệ thống. Rất mạnh mẽ và linh hoạt, có nhiều tùy chọn để lọc kết quả. Đầu ra có thể hơi khó đọc đối với người mới bắt đầu.
fuser Xác định các tiến trình đang sử dụng một file hoặc socket cụ thể. Đơn giản và dễ sử dụng. Ít tùy chọn hơn lsof.
netstat hoặc ss Hiển thị thông tin về các kết nối mạng. Chuyên dụng cho việc kiểm tra kết nối mạng. Không hiển thị thông tin về các file đang mở không liên quan đến mạng.

Các tình huống thực tế khác và cách lsof giải quyết

  • Bạn muốn unmount một ổ đĩa nhưng bị báo lỗi "device is busy": Sử dụng lsof để tìm tiến trình nào đang truy cập vào ổ đĩa đó, sau đó tắt tiến trình đó và thử unmount lại.
  • Bạn muốn xóa một file nhưng bị báo lỗi "permission denied": Sử dụng lsof để xem có tiến trình nào đang giữ file đó ở chế độ độc quyền (exclusive lock) hay không.
  • Bạn nghi ngờ một ứng dụng đang rò rỉ file descriptor: Sử dụng lsof để theo dõi số lượng file descriptor mà ứng dụng đang mở theo thời gian. Nếu số lượng này tăng liên tục, có thể có rò rỉ file descriptor.
  • Kiểm tra các tiến trình truy cập vào các file log: Để đảm bảo an ninh và theo dõi, bạn có thể dùng lsof để thường xuyên kiểm tra những tiến trình nào đang đọc hoặc ghi vào các file log quan trọng.

FAQ về lệnh lsof

  1. Tại sao tôi cần quyền root để chạy lsof?

    lsof cần quyền root để truy cập thông tin về tất cả các tiến trình trên hệ thống, bao gồm cả các tiến trình thuộc sở hữu của người dùng khác. Nếu bạn không có quyền root, bạn chỉ có thể xem thông tin về các tiến trình thuộc sở hữu của bạn.

  2. Làm thế nào để lọc kết quả lsof một cách hiệu quả hơn?

    Sử dụng kết hợp nhiều tùy chọn của lsof để lọc kết quả theo nhiều tiêu chí khác nhau. Ví dụ: bạn có thể lọc theo người dùng, tiến trình, cổng mạng và file cùng một lúc.

  3. lsof có thể gây ra vấn đề về hiệu suất không?

    lsof có thể tốn tài nguyên, đặc biệt là khi bạn chạy nó trên một hệ thống có nhiều tiến trình và file đang mở. Tuy nhiên, trong hầu hết các trường hợp, ảnh hưởng đến hiệu suất là không đáng kể. Bạn nên sử dụng nó một cách cẩn thận và chỉ khi cần thiết.

Kết luận

Lệnh lsof là một công cụ vô cùng hữu ích cho bất kỳ ai làm việc với hệ thống Linux. Nó cung cấp một cái nhìn chi tiết về các file đang mở trên hệ thống, giúp bạn gỡ lỗi ứng dụng, quản lý tài nguyên, bảo mật hệ thống và giải quyết các xung đột. Hy vọng rằng bài viết này đã cung cấp cho bạn một cái nhìn tổng quan về lsof và giúp bạn tự tin sử dụng nó để làm chủ hệ thống Linux của mình. Hãy thử nghiệm với các ví dụ và tùy chọn khác nhau để khám phá thêm sức mạnh của công cụ này! Chúc bạn thành công!

Last Updated : 22/08/2025