Lệnh lsof trong Linux

Giới thiệu

Trong lab này, bạn sẽ học cách sử dụng lệnh lsof, viết tắt của "list open files" (liệt kê các file đang mở), để xác định các file đang mở và các kết nối mạng trên một hệ thống Linux. Lệnh lsof là một công cụ mạnh mẽ cung cấp thông tin chi tiết về các tiến trình có các file đang mở, bao gồm file descriptor, loại file, thiết bị và tên file.

Lab này bao gồm ba bước chính: hiểu lệnh lsof, xác định các file đang mở bởi một tiến trình và định vị các kết nối mạng bằng cách sử dụng lsof. Bạn sẽ học cách diễn giải kết quả đầu ra của lệnh lsof và sử dụng các tùy chọn khác nhau để lọc kết quả. Lab này là một phần của chương trình System Monitoring and Management (Giám sát và Quản lý Hệ thống) và sẽ giúp bạn phát triển các kỹ năng về systemadmin và khắc phục sự cố.

Tìm hiểu về Lệnh lsof

Trong bước này, bạn sẽ tìm hiểu về lệnh lsof, viết tắt của "list open files" (liệt kê các file đang mở). Lệnh lsof là một công cụ mạnh mẽ trong Linux cho phép bạn xác định tiến trình nào đang mở file và kết nối mạng.

Để bắt đầu, hãy chạy lệnh lsof mà không có bất kỳ tham số nào:

sudo lsof

Ví dụ đầu ra:

COMMAND     PID   TID     USER   FD      TYPE             DEVICE SIZE/OFF       NODE NAME
systemd       1             root  cwd       DIR                8,1      4096          2 /
systemd       1             root  rtd       DIR                8,1      4096          2 /
systemd       1             root  txt       REG                8,1   1428176     655360 /usr/lib/systemd/systemd
systemd       1             root  mem       REG                8,1   2067688     655361 /usr/lib/x86_64-linux-gnu/libc-2.35.so
...

Lệnh lsof hiển thị rất nhiều thông tin về các file đang mở và các kết nối mạng trên hệ thống của bạn. Hãy phân tích các cột:

  • COMMAND: Tên của tiến trình có file đang mở.
  • PID: ID của tiến trình.
  • TID: ID của thread (nếu có).
  • USER: Người dùng sở hữu tiến trình.
  • FD: File descriptor, là một số xác định file đang mở.
  • TYPE: Loại của file đang mở (ví dụ: file thông thường, thư mục, socket, v.v.).
  • DEVICE: Số thiết bị của hệ thống file nơi file được đặt.
  • SIZE/OFF: Kích thước của file hoặc offset của file.
  • NODE: Số inode của file.
  • NAME: Tên của file hoặc kết nối mạng.

Đầu ra có thể khá dài, vì vậy bạn có thể sử dụng các tùy chọn khác nhau để lọc kết quả. Ví dụ: để chỉ xem các file đang mở cho một tiến trình cụ thể, bạn có thể sử dụng tùy chọn -p theo sau là ID tiến trình:

sudo lsof -p 1

Điều này sẽ hiển thị cho bạn tất cả các file đang mở cho tiến trình có PID là 1, thường là tiến trình systemd.

Bạn cũng có thể sử dụng lệnh lsof để tìm các file đang mở bởi một người dùng cụ thể:

sudo lsof -u labex

Điều này sẽ hiển thị cho bạn tất cả các file đang mở thuộc sở hữu của người dùng labex.

Trong bước tiếp theo, bạn sẽ tìm hiểu cách sử dụng lệnh lsof để xác định các file đang mở bởi một tiến trình cụ thể.

Xác định File Đang Mở bởi Một Tiến Trình

Trong bước này, bạn sẽ học cách sử dụng lệnh lsof để xác định các file đang mở được liên kết với một tiến trình cụ thể.

Hãy bắt đầu bằng cách tìm ID tiến trình (PID) của một tiến trình đang chạy. Bạn có thể sử dụng lệnh ps cho việc này:

sudo ps -ef | grep nginx

Ví dụ đầu ra:

root         825       1  0 14:32 ?        00:00:00 nginx: master process /usr/sbin/nginx -g daemon on; master_process on;
www-data    826     825  0 14:32 ?        00:00:00 nginx: worker process
www-data    827     825  0 14:32 ?        00:00:00 nginx: worker process

Trong ví dụ này, tiến trình nginx có PID là 825.

Bây giờ, bạn có thể sử dụng lệnh lsof để liệt kê tất cả các file đang mở được liên kết với tiến trình này:

sudo lsof -p 825

Ví dụ đầu ra:

COMMAND  PID USER   FD   TYPE DEVICE SIZE/OFF   NODE NAME
nginx   825 root  cwd    DIR  253,0     4096 1048576 /usr/sbin
nginx   825 root  rtd    DIR  253,0     4096       2 /
nginx   825 root  txt    REG  253,0   977528 1048577 /usr/sbin/nginx
nginx   825 root  mem    REG  253,0  2067688 1048578 /usr/lib/x86_64-linux-gnu/libc-2.35.so
nginx   825 root  mem    REG  253,0   169032 1048579 /usr/lib/x86_64-linux-gnu/ld-2.35.so
nginx   825 root    0u   CHR  136,0      0t0       3 /dev/pts/0
nginx   825 root    1u   CHR  136,0      0t0       3 /dev/pts/0
nginx   825 root    2u   CHR  136,0      0t0       3 /dev/pts/0

Đầu ra này hiển thị tất cả các file đang mở được liên kết với tiến trình nginx, bao gồm file thực thi, các thư viện dùng chung và các file descriptor đầu vào/đầu ra/lỗi tiêu chuẩn.

Bạn cũng có thể sử dụng lệnh lsof để tìm các file đang mở bởi một người dùng cụ thể. Ví dụ: để tìm tất cả các file đang mở thuộc sở hữu của người dùng labex:

sudo lsof -u labex

Điều này có thể hữu ích cho việc khắc phục sự cố hoặc hiểu hoạt động của một người dùng cụ thể trên hệ thống.

Trong bước tiếp theo, bạn sẽ tìm hiểu cách sử dụng lệnh lsof để định vị các kết nối mạng.

Định Vị Kết Nối Mạng Sử Dụng lsof

Trong bước này, bạn sẽ học cách sử dụng lệnh lsof để xác định các kết nối mạng trên hệ thống của bạn.

Để liệt kê tất cả các kết nối mạng trên hệ thống của bạn, bạn có thể sử dụng lệnh lsof với tùy chọn -i:

sudo lsof -i

Ví dụ đầu ra:

COMMAND   PID USER   FD   TYPE DEVICE SIZE/OFF NODE NAME
sshd      824 root   3u  IPv4  18620      0t0  TCP *:22 (LISTEN)
sshd      824 root   4u  IPv6  18622      0t0  TCP *:22 (LISTEN)
nginx    825 root   6u  IPv4  18650      0t0  TCP *:80 (LISTEN)
nginx    826 www-data 6u IPv4  18650      0t0  TCP *:80 (LISTEN)
nginx    827 www-data 6u IPv4  18650      0t0  TCP *:80 (LISTEN)

Đầu ra này hiển thị tất cả các kết nối mạng trên hệ thống, bao gồm tiến trình sshd đang lắng nghe trên cổng 22 (SSH) và tiến trình nginx đang lắng nghe trên cổng 80 (HTTP).

Bạn cũng có thể lọc đầu ra để chỉ hiển thị các loại kết nối mạng cụ thể. Ví dụ: để chỉ hiển thị các kết nối TCP:

sudo lsof -i TCP

Ví dụ đầu ra:

COMMAND   PID USER   FD   TYPE DEVICE SIZE/OFF NODE NAME
sshd      824 root   3u  IPv4  18620      0t0  TCP *:22 (LISTEN)
sshd      824 root   4u  IPv6  18622      0t0  TCP *:22 (LISTEN)
nginx    825 root   6u  IPv4  18650      0t0  TCP *:80 (LISTEN)
nginx    826 www-data 6u IPv4  18650      0t0  TCP *:80 (LISTEN)
nginx    827 www-data 6u IPv4  18650      0t0  TCP *:80 (LISTEN)

Bạn cũng có thể lọc đầu ra để chỉ hiển thị các kết nối cho một người dùng hoặc tiến trình cụ thể. Ví dụ: để chỉ hiển thị các kết nối mạng cho người dùng labex:

sudo lsof -i -u labex

Lệnh lsof có thể là một công cụ mạnh mẽ để khắc phục sự cố mạng và hiểu hoạt động mạng trên hệ thống của bạn.

Tóm tắt

Trong lab này, bạn sẽ học cách sử dụng lệnh lsof, viết tắt của "list open files" (liệt kê các file đang mở). Lệnh lsof là một công cụ mạnh mẽ trong Linux cho phép bạn xác định tiến trình nào đang mở file và kết nối mạng. Bạn sẽ bắt đầu bằng cách chạy lệnh lsof mà không có bất kỳ tham số nào để hiểu các cột thông tin khác nhau mà nó cung cấp, chẳng hạn như tên tiến trình, ID tiến trình, file descriptor, loại file và tên file. Sau đó, bạn sẽ học cách sử dụng tùy chọn -p để xem các file đang mở cho một tiến trình cụ thể. Cuối cùng, bạn sẽ khám phá cách sử dụng lệnh lsof để định vị các kết nối mạng trên hệ thống của bạn.

Last Updated : 10/05/2025