Lệnh lsof trong linux với các ví dụ dễ hiểu

Lệnh lsof trong linux là một công cụ mạnh mẽ, giúp bạn liệt kê tất cả các file đang mở bởi các tiến trình. Nó cho phép bạn xác định tiến trình nào đang sử dụng một file cụ thể, rất hữu ích cho việc gỡ lỗi. Với lsof, bạn có thể dễ dàng tìm ra nguyên nhân gây ra lỗi "file đang được sử dụng" và giải phóng tài nguyên.

Lệnh lsof trong linux là gì?

Lệnh command lsof in linux là một công cụ dòng lệnh mạnh mẽ, giúp bạn liệt kê tất cả các tệp tin đang mở bởi các tiến trình trong hệ thống. Nó cho phép bạn xem tiến trình nào đang sử dụng một tệp tin cụ thể, ổ cắm mạng, hoặc thậm chí là một thư viện dùng chung. Với lsof, bạn có thể dễ dàng chẩn đoán các vấn đề liên quan đến việc sử dụng tài nguyên, ví dụ như khi một tệp tin bị khóa. Đây là một công cụ vô cùng hữu ích cho các nhà quản trị hệ thống và những người dùng muốn hiểu rõ hơn về hoạt động của hệ thống Linux. Bạn có thể sử dụng nó để tìm ra tiến trình nào đang gây ra xung đột cổng mạng.

```html

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

Trong bước này, bạn sẽ làm quen với lệnh lsof, viết tắt của "list open files". Lệnh lsof là một công cụ mạnh mẽ trong Linux, giú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 để xem kết quả.

sudo lsof

Ví dụ về kết quả:

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à kết nối mạng trên hệ thống của bạn. Hãy cùng phân tích các cột thông tin này.

  • COMMAND: Tên của tiến trình đang mở file.
  • PID: ID của tiến trình (Process ID).
  • TID: ID của luồng (Thread ID), nếu có.
  • USER: Người dùng sở hữu tiến trình.
  • FD: File descriptor, một số định danh cho file đang mở.
  • TYPE: Loại file đang mở (ví dụ: file thông thường, thư mục, socket...).
  • DEVICE: Số hiệu thiết bị của hệ thống file nơi file được lưu trữ.
  • 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.

Kết quả trả về có thể rất dài, vì vậy bạn có thể sử dụng các tùy chọn để lọc kết quả. Ví dụ, để xem các file đang mở của một tiến trình cụ thể, bạn có thể dùng tùy chọn -p, theo sau là PID.

sudo lsof -p 1

Lệnh này sẽ hiển thị tất cả các file đang mở của 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

Lệnh này sẽ hiển thị 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ẽ học 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 các File đang Mở bởi một Process

Trong bước này, bạn sẽ học cách dùng lệnh lsof để xác định các file đang mở liên quan đến một process cụ thể.

Chúng ta hãy bắt đầu bằng việc tìm Process ID (PID) của một process đang chạy. Bạn có thể dùng lệnh ps để làm việc này.

sudo ps -ef | grep nginx

Ví dụ về kết quả:

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, process nginx có PID là 825, bạn hãy lưu ý thông tin này.

Bây giờ, bạn có thể dùng lệnh lsof để liệt kê tất cả các file đang mở liên quan đến process này.

sudo lsof -p 825

Ví dụ về kết quả:

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

Kết quả này hiển thị tất cả các file đang mở liên quan đến process nginx, bao gồm file thực thi, thư viện chia sẻ và các file descriptor tiêu chuẩn.

Bạn cũng có thể dùng lệnh lsof để tìm các file đang mở bởi một user cụ thể. Ví dụ, để tìm tất cả các file đang mở thuộc sở hữu của user 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 rõ hoạt động của một user cụ thể trên hệ thống.

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

Tìm kiếm Kết nối Mạng bằ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, bạn có thể dùng lệnh lsof với tùy chọn -i.

sudo lsof -i

Ví dụ về kết quả:

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)

Kết quả 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à nginx trên cổng 80 (HTTP).

Bạn cũng có thể lọc kết quả để chỉ hiển thị các loại kết nối mạng cụ thể, ví dụ, chỉ hiển thị kết nối TCP.

sudo lsof -i TCP

Ví dụ về kết quả:

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 kết quả để 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ụ, kết nối mạng cho người dùng labex.

sudo lsof -i -u labex

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

Kết luận cho linux lsof command

Vậy là chúng ta đã cùng nhau khám phá những điều thú vị về lệnh lsof trong Linux rồi! Hy vọng qua bài viết này, bạn đã hiểu rõ hơn về cách linux lsof command hoạt động và ứng dụng của nó trong thực tế. Lệnh này thực sự là một công cụ mạnh mẽ giúp bạn kiểm soát hệ thống một cách hiệu quả. Đừng ngần ngại thử nghiệm các tùy chọn khác nhau để làm quen với lệnh này nhé. Việc thực hành thường xuyên sẽ giúp bạn ghi nhớ và sử dụng lsof một cách thành thạo hơn đấy. Chúc bạn thành công trên con đường chinh phục Linux và khám phá thêm nhiều lệnh hữu ích khác! Hãy nhớ rằng, việc tìm hiểu và sử dụng thành thạo các công cụ như lsof sẽ giúp bạn trở thành một người quản trị hệ thống giỏi hơn.

Last Updated : 14/10/2025