NỘI DUNG
sử dụng lệnh lsof trong Linux một cách hiệu quả!

lsof là gì?
lsof là một công cụ dòng lệnh mạnh mẽ trong Linux, dùng để liệt kê tất cả các tệp đang được mở bởi các tiến trình (processes) trên hệ thống.
Từ “lsof” là viết tắt của “list open files”. Trong Linux, mọi thứ như tệp, thư mục, socket, thiết bị, hoặc kết nối mạng đều được xem là một loại tệp. Vì vậy, lsof không chỉ liệt kê các tệp thông thường mà còn cung cấp thông tin chi tiết về các tài nguyên hệ thống đang được sử dụng, giúp quản trị viên hệ thống và người dùng chẩn đoán vấn đề, kiểm tra kết nối mạng, hoặc quản lý tài nguyên.
Chức năng và ứng dụng lệnh lsof trong Linux
Thông thường trong quản trị linux thì lsof thường được sử dụng trong các công việc sau:
- Xác định các tệp hoặc thư mục nào đang được sử dụng bởi một tiến trình cụ thể.
- Kiểm tra các kết nối mạng đang mở (TCP/UDP).
- Tìm kiếm tiến trình đang giữ các tệp đã bị xóa nhưng vẫn mở.
- Quản lý tài nguyên hệ thống bằng cách liệt kê các socket hoặc tệp bị khóa.
- Hỗ trợ gỡ lỗi và tối ưu hóa hiệu suất server.
Các tùy chọn của lệnh lsof trong Linux
Lệnh lsof có khá nhiều tùy chọn. Dưới đây là một số tùy chọn hữu ích nhất.
Lưu ý: Các tùy chọn trong giao diện dòng lệnh (CLI) của Linux phân biệt chữ hoa chữ thường, vì vậy hãy cẩn thận khi sử dụng.
Tuỳ chọn | Mô tả |
-i | Hiển thị danh sách các file đang mở bởi các kết nối mạng. |
-u | Hiển thị danh sách các file đang mở bởi một người dùng cụ thể. |
-p | Hiển thị danh sách các file đang mở bởi một tiến trình cụ thể. |
-R | Hiển thị danh sách các file đang mở bởi ID của tiến trình cha. |
Cách lệnh lsof thường dùng trong Linux
Trong quá trình quản trị Linux thì tôi thường sử dụng các lệnh lsof sau, và chia sẻ lại đến các bạn cùng đọc.
1. List Open Files
Là nhóm lệnh lsof dùng để liệt kê các tệp đang mở trên hệ thống, bao gồm tệp thông thường, thư mục, hoặc tài nguyên được sử dụng bởi các tiến trình, giúp kiểm tra trạng thái tài nguyên.
1.1 lsof
Liệt kê tất cả các tệp đang được mở bởi bất kỳ tiến trình nào.
lsof

1.2 lsof -p
Liệt kê các tệp được mở bởi tiến trình có PID. Ví dụ bạn muốn xem tiến trình có PID 205511 đang làm gì thì gõ
lsof -p 205511

1.3 lsof -p ^
Liệt kê các tệp được mở bởi các tiến trình khác ngoài PID. Ví dụ bạn muốn xem tiến trình có PID 205511 đang làm gì thì gõ
lsof -p ^205511
1.4 lsof -u username
Liệt kê các tệp được mở bởi các tiến trình thuộc về người dùng cụ thể. Ví dụ tôi muốn xem user zabbix
đang làm gì thì nhập lệnh sau
lsof -u zabbix

1.5 lsof -u^root
Lệnh này dùng để liệt kê các tệp được mở bởi tất cả các tiến trình không thuộc về root
lsof -u^root
1.6 lsof <directory>
Lệnh này sẽ hiển thị các tiến trình đang sử dụng thư mục được chỉ định. Ví dụ muốn xem tiến trình nào sử dụng thư mục /home
thì nhập lệnh sau
lsof /home
1.7 lsof <filename>
Lệnh sẽ liệt kê tất cả các tiến trình đã mở tệp được chỉ định. VÍ dụ xem tiến trình đang sử dụng tệp syslog
thì nhập như sau
lsof /var/log/syslog
1.8 lsof +D <directory>
Liệt kê tất cả các tệp đã được mở trong thư mục chỉ định. Ví dụ muốn kiểm tra các tệp trong /tmp
thì chạy lệnh sau
lsof +D /tmp
1.9 lsof -c <command>
Liệt kê các tệp được mở bởi các tiến trình đang thực thi lệnh <command>. Ví dụ lsof -c apache2
. Xem tệp của tiến trình apache2
lsof -c apache2
1.10 lsof -d mem
Liệt kê tất cả các tệp được ánh xạ bộ nhớ (memory-mapped files)
lsof -d mem
1.11 lsof +L1
Liệt kê các tệp đã bị xóa nhưng vẫn được giữ mở bởi các tiến trình, có nghĩa tìm các tệp đã xóa nhưng vẫn chiếm tài nguyên.
lsof +L1

2. List Network Connections and Sockets
Là nhóm lệnh lsof dùng để hiển thị các kết nối mạng (TCP/UDP) và socket đang mở, hỗ trợ kiểm tra cổng, giao thức (IPv4/IPv6), và trạng thái kết nối.
2.1 lsof -i
Liệt kê tất cả các kết nối mạng TCP/UDP đang mở.
lsof -i

2.2 lsof -i :port
Liệt kê các kết nối TCP/UDP trên cổng chỉ định. Ví dụ muốn kiểm tra cổng 80 thì nhập lệnh sau
lsof -i :80

Nếu muốn liệt kê các kết nối TCP mở trong phạm vi cổng thì sử dụng port:port
. Ví dụ muốn xem kết nối từ 10050-10051
thì sử dụng lệnh sau
lsof -i :10050-10051

2.3 lsof -i -n
Liệt kê các kết nối mạng mà không thực hiện tra cứu DNS ngược.
lsof -i -n
2.4 lsof -i -P
Liệt kê các kết nối mạng mà không chuyển đổi tên cổng
lsof -i -P
2.5 lsof -i6
Liệt kê các kết nối IPv6 (sử dụng -i4 cho IPv4)
lsof -i6
3. Other Usages
Là nhóm lệnh lsof bổ sung, bao gồm liệt kê socket Unix, kiểm tra thiết bị cụ thể (như /dev/tty1), hoặc kết thúc hoạt động của người dùng, phục vụ các nhu cầu quản lý hệ thống khác.
3.1 lsof -U
Liệt kê các socket miền Unix đang mở
lsof -U

3.2 kill -9 $(lsof -t -u )
Kết thúc tất cả các hoạt động của một người dùng cụ thể. Ví dụ lệnh này sẽ dừng các tiến trình của nginx
kill -9 $(lsof -t -u nginx)
3.3 lsof -r <seconds>
Tự động làm mới danh sách theo khoảng thời gian (giám sát liên tục). Ví dụ cập nhật danh sách sau mỗi 5s
lsof -r 5
3.4 lsof -a
Kết hợp các điều kiện lọc (AND logic). Liệt kê tệp của “mysql” trên cổng 3306.
lsof -a -u mysql -i :3306
3.5 lsof -g <pgrp>
Liệt kê các tệp của nhóm tiến trình (process group). Ví dụ xem tệp của nhóm tiến trình 1234
lsof -g 1234
Kết luận
Lệnh lsof là một công cụ không thể thiếu cho các quản trị viên hệ thống và người dùng Linux khi cần quản lý hoặc gỡ lỗi tài nguyên hệ thống. Với khả năng liệt kê chi tiết các tệp, kết nối mạng, và socket đang mở, nó giúp người dùng dễ dàng phát hiện vấn đề như tệp bị khóa, kết nối bất thường, hoặc tài nguyên bị lãng phí. Bằng cách kết hợp các tùy chọn khác nhau, bạn có thể tùy chỉnh lsof để phù hợp với nhu cầu cụ thể. Hãy thử nghiệm các lệnh trên để làm quen và khai thác tối đa tiềm năng của công cụ này!