Lệnh lsof trong Linux là công cụ giúp bạn liệt kê các file, thư mục, thiết bị và socket đang được tiến trình sử dụng, từ đó nhanh chóng xác định process đang giữ file, port hoặc thư mục gây lỗi hệ thống. Dựa trên trải nghiệm xử lý sự cố thực tế như không unmount được partition, port bị chiếm, file log phình bất thường, mình sẽ tập trung vào cách dùng lsof Linux theo hướng thực hành từ và một số mẹo nâng cao để bạn áp dụng hiệu quả trong công việc hằng ngày.
Những điểm chính
- Quan điểm của mình: Với bất kỳ admin Linux nào, việc nắm vững lsof và biến nó thành thói quen khi xử lý sự cố file, port và kết nối mạng quan trọng không kém gì các lệnh top, ps hay netstat, vì đây là công cụ cốt lõi để biết được tài nguyên hệ thống đang bị tiến trình sử dụng như thế nào.
- Khái niệm: Hiểu rõ lsof là công cụ dùng để liệt kê các file đang mở, giúp bạn nhận biết vai trò nền tảng của nó trong việc chẩn đoán và xử lý các vấn đề về tài nguyên hệ thống.
- Cú pháp và các tùy chọn: Nắm vững cú pháp cơ bản và các tùy chọn quan trọng, giúp bạn kiểm soát chi tiết cách lọc và hiển thị thông tin về các file, thư mục, port và kết nối mạng.
- Cách cài đặt: Nắm vững các bước cài đặt lsof trên các hệ điều hành phổ biến, giúp bạn nhanh chóng thiết lập và bắt đầu sử dụng công cụ này.
- Giải mã thông số: Hiểu ý nghĩa các cột dữ liệu trong bảng kết quả, giúp bạn phân tích chính xác mối liên hệ giữa các tiến trình và tệp tin đang hoạt động.
- Ứng dụng thực tế: Áp dụng lsof vào các kịch bản cụ thể như tìm tiến trình chiếm port hay xử lý lỗi dung lượng đĩa ảo, giúp nâng cao năng lực giải quyết sự cố hệ thống trong thực tiễn.
- Các mẹo sử dụng nâng cao: Tìm hiểu các mẹo hữu ích như kết hợp với kill và tạo alias, giúp bạn làm việc với lsof một cách hiệu quả và chuyên nghiệp hơn trong quản trị hệ thống.
- Câu hỏi thường gặp: Giải đáp các thắc mắc liên quan đến lệnh lsof trong Linux.
Lệnh lsof trong Linux là gì?
Lệnh lsof trong Linux là tiện ích dòng lệnh mạnh mẽ dùng để liệt kê danh sách các tệp tin đang mở trên hệ thống. Tiện ích nguồn mở này được phát triển và hỗ trợ ban đầu bởi Victor A. Abell và hiện tại được duy trì bởi nhóm lsof-org trên nền tảng GitHub.
Vì hệ điều hành Linux tuân theo triết lý “mọi thứ đều là một tệp tin”, lệnh lsof không chỉ hiển thị các tệp tin văn bản thông thường mà còn bao gồm thư mục, thiết bị phần cứng, pipe và các socket mạng. Công cụ này hoạt động dựa trên việc đọc dữ liệu từ hệ thống file ảo /proc.
Mỗi dòng trong output của lsof thể hiện mối liên hệ chặt chẽ giữa một tiến trình và một tệp tin đang mở. Nhờ đó, người quản trị hệ thống có thể nhanh chóng xác định tiến trình nào đang giữ file, port, thư mục hoặc socket để xử lý các tình huống như lỗi umount “target is busy”, file log đã xoá nhưng chưa giải phóng dung lượng, hay kiểm tra các kết nối mạng đang mở trên máy chủ Linux.

Cú pháp và các tùy chọn quan trọng của lệnh lsof
Cú pháp chuẩn của lệnh lsof
Lệnh lsof có cú pháp tổng quát tương đối linh hoạt, cho phép bạn kết hợp nhiều tùy chọn và bộ lọc khác nhau để truy vết file, thư mục, user, PID hoặc kết nối mạng đang mở. Cú pháp tổng quát:
lsof [options] [file_or_filter]Trong đó:
options: Là các tùy chọn lọc và chế độ hiển thị như-i,-t,+D,-u,-p,-n,-r,… dùng để thu hẹp tập kết quả theo kiểu tài nguyên hoặc tiêu chí cụ thể.file_or_filter: Có thể là đường dẫn file/thư mục (/var/log/app.log), port (:8080), biểu thức liên quan đến giao thức (TCP, UDP), địa chỉ IP hoặc các pattern khác tùy trường hợp sử dụng.
Các tùy chọn của lệnh lsof Linux
Các tùy chọn dưới đây là nhóm quan trọng và thường gặp nhất khi bạn sử dụng lsof trong Linux, giúp bạn nhanh chóng xác định process đang giữ port, file, thư mục hoặc đang mở nhiều kết nối mạng:
| Tùy chọn | Công dụng chính | Ví dụ lệnh | Mô tả |
|---|---|---|---|
-i | Lọc theo kết nối mạng (TCP/UDP), port, địa chỉ | lsof -i :22 | Liệt kê các socket mạng, ví dụ tất cả kết nối/port liên quan đến SSH 22. |
-t | Chỉ in ra PID (không in bảng chi tiết) | lsof -t -i :8080 | Trả về danh sách PID đang chiếm port 8080, rất hữu ích khi dùng kèm kill. |
+D | Tìm tất cả file đang mở trong một thư mục (đệ quy) | lsof +D /var/log | Liệt kê mọi file đang mở bên trong /var/log, giúp tìm tiến trình giữ thư mục. |
-u | Lọc theo user cụ thể | lsof -u nginx | Hiển thị các file/kết nối do user nginx đang mở; dùng cho audit phân quyền. |
-p | Lọc theo PID | lsof -p 1234 | Xem toàn bộ file, socket… mà tiến trình có PID 1234 đang mở. |
-n | Không phân giải tên host, hiển thị trực tiếp IP | lsof -n -i | Tăng tốc hiển thị khi xem các kết nối mạng, không cần DNS lookup. |
-r | Chạy ở chế độ lặp lại theo chu kỳ thời gian | lsof -r 10 -i | Lặp lại lệnh lsof mỗi 10 giây để theo dõi biến động file/kết nối theo thời gian. |
Cài đặt lsof trên các bản phân phối Linux
Cài đặt lsof trên Debian/Ubuntu
Trên hệ điều hành Debian/Ubuntu và các bản phân phối cùng họ, lsof thường có sẵn trong kho APT nên việc cài đặt khá đơn giản.
Bước 1: Bạn cập nhật danh sách package để hệ thống lấy thông tin mới nhất về phiên bản lsof.
sudo apt updateBước 2: Bạn cài đặt lsof từ repository chính thức của hệ điều hành.
sudo apt install lsofBước 3: Bạn kiểm tra lại xem lsof đã cài đặt thành công hay chưa bằng cách hiển thị version hoặc chạy lệnh cơ bản.
lsof -v
sudo lsofCài đặt lsof trên CentOS/RHEL/Fedora
Với các bản phân phối thuộc họ RHEL như CentOS, RHEL, Fedora hoặc các bản tương thích (Rocky, AlmaLinux), lsof được phân phối qua yum/dnf và có thể cài trực tiếp bằng một lệnh duy nhất.
Bước 1: Trên các hệ dùng yum (CentOS/RHEL đời cũ), bạn cài lsof từ kho RPM mặc định hoặc EPEL (nếu cần).
sudo yum install lsofBước 2: Trên các hệ dùng dnf (RHEL, Rocky, AlmaLinux, Fedora đời mới), bạn sử dụng dnf để cài lsof.
sudo dnf install lsofBước 3: Sau khi cài đặt, bạn xác nhận lệnh đã hoạt động bằng cách kiểm tra phiên bản hoặc liệt kê thử các file đang mở.
lsof -v
sudo lsofÝ nghĩa các cột thông tin trong kết quả của lệnh lsof
Khi bạn thực thi lệnh lsof trên terminal, hệ thống sẽ trả về một bảng dữ liệu chi tiết. Bạn cần nắm rõ ý nghĩa của các cột sau để đọc hiểu kết quả một cách chính xác:
- COMMAND: Tên của lệnh hoặc chương trình đang thực thi tiến trình.
- PID: Số định danh tiến trình (Process ID) đang mở tệp tin.
- USER: Tên người dùng sở hữu và khởi chạy tiến trình.
- FD: Bộ mô tả tệp tin (File Descriptor), có thể là cwd (thư mục làm việc hiện tại), txt (tệp văn bản của chương trình), hoặc các con số đại diện cho quyền truy cập.
- TYPE: Loại của tệp tin, chẳng hạn như DIR (thư mục), REG (tệp tin thông thường), CHR (thiết bị ký tự), IPv4, IPv6.
- DEVICE: Số hiệu thiết bị chứa tệp tin.
- SIZE/OFF: Kích thước của tệp tin hoặc mức độ dịch chuyển của tệp.
- NODE: Số hiệu Node của tệp tin cục bộ hoặc luồng dữ liệu (TCP, UDP).
- NAME: Tên đường dẫn tuyệt đối của tệp tin hoặc tên điểm gắn kết mà tệp tin cư trú.

Các kịch bản thực tế khi dùng lệnh lsof
- Tìm tiến trình đang chiếm port
- Xác định process đang mở một file hoặc thiết bị
- Tìm process đang giữ file log đã xoá
- Lọc theo user để xem user đó đang mở những file gì
- Tìm tiến trình mở nhiều file nhất
- Liệt kê các kết nối mạng đang mở, lọc TCP và trạng thái LISTEN
- Một số biến thể hữu ích khác trong thực tế
Tìm tiến trình đang chiếm port
Khi gặp lỗi “port already in use” hoặc cần biết dịch vụ nào đang lắng nghe trên một cổng cụ thể, bạn có thể dùng lsof để truy ra tiến trình tương ứng theo từng bước rõ ràng.
Bước 1: Bạn kiểm tra toàn bộ kết nối mạng đang mở (TCP/UDP) trên hệ thống bằng lệnh lsof cơ bản cho network.
lsof -iBước 2: Bạn thu hẹp phạm vi tìm kiếm xuống một port cụ thể, ví dụ port 61209, để xem tiến trình nào đang chiếm cổng đó.
lsof -i :61209
Bước 3: Bạn đọc các cột COMMAND, PID, USER và NAME trong output để xác định chương trình đang dùng port 61209, sau đó quyết định hành động tiếp theo (dừng dịch vụ, đổi port, cấu hình lại ứng dụng…).
Bước 4: Nếu chỉ cần lấy PID để dùng trong script hoặc kết hợp với kill, bạn có thể dùng thêm tùy chọn -t.
lsof -t -i :9001Bước 5: Bạn dùng PID vừa lấy để dừng hoặc restart tiến trình khi cần giải phóng port.
kill -9 $(lsof -t -i :8080)Xác định process đang mở một file hoặc thư mục cụ thể
Đối với các lỗi như “target is busy” khi unmount hoặc trường hợp xoá file log nhưng dung lượng đĩa không giảm, bạn cần tìm ra tiến trình đang giữ file/thư mục đó bằng lsof.
Bước 1: Khi nghi ngờ một file cụ thể đang bị giữ, bạn sử dụng lsof với đường dẫn file để liệt kê các tiến trình đang mở file đó.
lsof /var/log/app.logBước 2: Bạn quan sát các cột COMMAND, PID, USER trong kết quả để biết tiến trình nào đang sử dụng file log, từ đó dừng tiến trình hoặc xoay vòng log đúng cách trước khi unmount hoặc xoá file.
Bước 3: Nếu không biết chính xác file nào, nhưng muốn tìm các file đã bị xoá mà vẫn còn mở (thường gây hiện tượng “đã xoá log nhưng không giải phóng dung lượng”), bạn có thể lọc theo từ khoá deleted.
lsof | grep deleted
Bước 4: Từ danh sách các file “deleted” cùng PID tương ứng, bạn xác định tiến trình cần restart hoặc dừng để giải phóng file descriptor, giúp hệ thống trả lại dung lượng đĩa.
Bước 5: Trong trường hợp một thư mục không unmount được, bạn có thể dùng lsof với tùy chọn +D (nếu được hỗ trợ) để liệt kê tất cả file đang mở trong thư mục đó.
lsof +D /mnt/dataBước 6: Dựa trên danh sách tiến trình đang mở file trong thư mục, bạn xử lý lần lượt các process này trước khi thực hiện lại thao tác unmount hoặc xoá/thay thế thư mục.
Tìm process đang giữ file log đã xoá
Trong tình huống xoá file log nặng nhưng dung lượng ổ đĩa không tăng, rất có thể file đó vẫn đang được một tiến trình giữ mở thông qua file descriptor.
Bước 1: Bạn liệt kê toàn bộ file đang mở trên hệ thống và lọc các dòng có trạng thái “deleted” để tìm file đã bị xoá nhưng vẫn còn descriptor.
sudo lsof | grep deletedBước 2: Bạn xác định PID và COMMAND tương ứng với mỗi file “deleted”, từ đó xác định tiến trình nào cần restart hoặc dừng để giải phóng dung lượng.
Bước 3: Nếu biết chính xác đường dẫn file log (trước khi xoá), có thể dùng lsof trực tiếp với đường dẫn đó để xem process nào đang giữ.
sudo lsof /var/log/app.logLọc theo user để xem user đó đang mở file gì
Khi quản lý server có nhiều user, bạn có thể muốn kiểm tra một user cụ thể đang mở những file hoặc socket nào để mục đích audit hoặc xử lý sự cố.
Bước 1: Bạn sử dụng lsof với tùy chọn -u để lọc theo user cần kiểm tra, ví dụ user deploy.
lsof -u deploy
Bước 2: Quan sát danh sách các file, thư mục, thiết bị và kết nối mạng do user này mở, từ đó đánh giá hoạt động của user và phát hiện các tiến trình bất thường nếu có.
Bước 3: Khi cần loại trừ một user nào đó khỏi kết quả, bạn có thể sử dụng cú pháp phủ định với ^.
sudo lsof -u ^deployTìm tiến trình mở nhiều file nhất
Khi hệ thống gặp lỗi “Too many open files”, bạn cần xác định tiến trình hoặc loại tiến trình nào đang mở nhiều file nhất để có hướng xử lý.
Bước 1: Bạn dùng lsof để liệt kê toàn bộ file đang mở, sau đó pipe kết quả qua awk, sort và uniq để thống kê số lần xuất hiện theo tên lệnh.
lsof | awk '{print $1}' | sort | uniq -c | sort -nr | head
Bước 2: Dựa trên kết quả, bạn sẽ thấy các command đứng đầu danh sách (mở nhiều file nhất), từ đó đi sâu vào từng tiến trình cụ thể để tối ưu cấu hình hoặc điều chỉnh giới hạn file descriptor.
Liệt kê các kết nối mạng đang mở, lọc TCP và trạng thái LISTEN
Để kiểm tra các dịch vụ đang lắng nghe trên hệ thống (TCP LISTEN), bạn có thể kết hợp lsof với các tùy chọn dành cho TCP và trạng thái socket.
lsof -iTCP -sTCP:LISTEN -P | grep nginxTrong đó:
sudo lsof -iTCP -sTCP:LISTEN -P: Liệt kê tất cả các socket TCP đang lắng nghe trên máy chủ, không phân giải tên port.| grep nginx: Lọc theo dịch vụ cụ thể, chẳng hạn như nginx.

Từ kết quả, bạn xác định port mà nginx (hoặc dịch vụ khác) đang lắng nghe, tương ứng với PID và user, phục vụ cho việc kiểm tra cấu hình hoặc khắc phục lỗi port.
Một số biến thể hữu ích khác trong thực tế
Ngoài các kịch bản trên, lsof còn có nhiều biến thể lệnh giúp hỗ trợ điều tra sự cố nhanh hơn trong môi trường thực tế.
Theo dõi kết nối mạng theo IP cụ thể với lệnh:
sudo lsof -n -i@192.168.1.10Kết hợp lọc user + IP để xem các kết nối mạng do user deploy mở liên quan đến IP 192.168.1.10.:
sudo lsof -n -u deploy -i@192.168.1.10Theo dõi lặp lại theo chu kỳ (chế độ repeat) để xem thay đổi theo thời gian:
sudo lsof -r 10 -iMẹo sử dụng lsof hiệu quả trong quản trị hệ thống
Kết hợp lsof với kill/script trong các thao tác tự động
Lệnh lsof trở nên rất hữu ích khi kết hợp với kill hoặc các script shell, đặc biệt trong các tình huống cần giải phóng port hoặc dừng nhanh một nhóm tiến trình dựa trên tiêu chí cụ thể.
Bước 1: Bạn lấy PID của tiến trình cần xử lý bằng lsof với tùy chọn -t, ví dụ tìm PID đang chiếm port 3000.
lsof -t -i :3000Bước 2: Bạn kết hợp trực tiếp lsof với kill trong một dòng lệnh để tự động dừng tiến trình đang giữ port.
kill $(lsof -t -i :3000)Bước 3: Với các tiến trình cần gửi tín hiệu HUP để reload (ví dụ sshd), bạn có thể dùng lsof để lấy PID theo tên command rồi kết hợp với kill.
kill -HUP $(lsof -t -c sshd)Dùng lsof để điều tra lỗi “Too many open files”
Khi gặp lỗi “Too many open files”, bạn cần vừa xác định tiến trình mở nhiều file bất thường bằng lsof, vừa kiểm tra giới hạn file descriptor của hệ thống để có hướng xử lý đầy đủ.
Bước 1: Bạn sử dụng lsof để thống kê số lượng file đang mở theo command, từ đó phát hiện nhóm tiến trình có nguy cơ gây rò rỉ file descriptor.
lsof | awk '{print $1}' | sort | uniq -c | sort -nr | headBước 2: Sau khi xác định ứng dụng nghi ngờ, bạn dùng lsof lọc theo PID hoặc user để xem chi tiết các file mà ứng dụng đó đang mở.
lsof -p <PID>
lsof -u deployBước 3: Song song đó, bạn kiểm tra giới hạn file tối đa của hệ thống và của user để đảm bảo cấu hình đủ cao cho workload hiện tại.
- Kiểm tra file-max của kernel:
cat /proc/sys/fs/file-max- Kiểm tra giới hạn nofile cho user:
ulimit -nMột số alias và tip nâng cao
Để làm việc nhanh hơn với lsof trong môi trường quản trị hệ thống, bạn có thể định nghĩa sẵn một số alias và áp dụng thêm các tùy chọn như -n, -P, -r để tối ưu tốc độ và khả năng theo dõi.
Bước 1: Bạn tạo alias phục vụ các thao tác lặp lại, ví dụ kiểm tra nhanh các port TCP đang LISTEN.
echo "alias lsoflisten='sudo lsof -iTCP -sTCP:LISTEN -P'" >> ~/.bashrcBước 2: Bạn dùng -n và -P để tránh phân giải DNS và tên port, giúp lệnh chạy nhanh hơn trên server nhiều kết nối.
sudo lsof -n -P -iBước 3: Khi cần giám sát liên tục, bạn sử dụng -r để lặp lại lệnh sau một khoảng thời gian nhất định (ví dụ 10 giây), giúp bạn quan sát sự thay đổi file/kết nối theo thời gian.
sudo lsof -r 10 -iCâu hỏi thường gặp
Có nên để lsof chạy thường xuyên trên cron để giám sát không?
Lsof có thể tiêu tốn tài nguyên đáng kể trên hệ thống có nhiều file/kết nối nếu chạy không có bộ lọc hoặc lặp lại liên tục. Nếu cần dùng trong cron, nên giới hạn phạm vi (ví dụ chỉ lsof -iTCP -sTCP:LISTEN -P hoặc theo một PID/user cụ thể) và tránh chạy với tần suất quá dày để không tạo thêm tải cho CPU và I/O.
Lệnh lsof Linux có thể hỗ trợ điều tra bảo mật, incident response không?
Lsof rất hữu ích trong điều tra bảo mật vì có thể liệt kê tiến trình nào đang mở kết nối mạng, đang tương tác với file nhạy cảm hoặc dùng port bất thường. Bạn có thể kết hợp lsof -i, lsof -u , lsof -p để rà soát nhanh các kết nối đáng ngờ, từ đó khoanh vùng tiến trình phục vụ phân tích sâu hơn trong quy trình incident response.
Lsof Linux có rủi ro bảo mật nào cần lưu ý khi sử dụng trên hệ thống production không?
Bản thân lsof trên hệ thống là binary hệ thống tiêu chuẩn, nhưng việc cấp quyền sudo rộng rãi cho người dùng chạy lsof có thể làm lộ thông tin nhạy cảm về tiến trình và file. Ngoài ra, khi sử dụng thư viện/packet lsof cho ứng dụng, cần kiểm tra lỗ hổng command injection đã được công bố để tránh trường hợp nhập liệu người dùng chưa được kiểm soát bị truyền trực tiếp vào lệnh lsof.
Khi bạn đã nắm vững cách sử dụng lệnh lsof cùng cách kết hợp với grep, awk, hay kill, việc quản lý hệ thống Linux sẽ trở nên trực quan và dễ dàng hơn bao giờ hết. Hy vọng với bài viết chi tiết này, bạn có thể tích hợp lsof vào quy trình vận hành máy chủ hàng ngày của mình.




