[Linux] 10 ví dụ sử dụng chương trình lệnh “lsof” trên Linux

Hôm nay mình sẽ chỉ cho các bạn cách sử dụng chương trình lệnh Linuxlsof” trên hệ thống Linux nhằm cung cấp các thông tin cho quá trình debug khá quan trọng.

lsof” hay còn gọi là “list open files“, là một chương trình lệnh dùng để liệt kê thông tin về các file trên hệ thống đang hoặc đã được mở (tiến trình còn hoạt động) bởi các tiến trình. Mà ta biết là trên hệ thống Unix/Linux thì mọi thứ đều là file (pipe, socket, directory, device,..).

Chính vì vậy mà hôm nay mình sẽ hướng dẫn các bạn các mẫu lệnh sử dụng lsof phổ biến để tìm kiếm thông tin về các file đã được mở như thế nào khi debug.

Hướng dẫn sử dụng chương trình lệnh “lsof” trên Linux

1. Lệnh cơ bản và output giải thích

– Output của lsof có một dòng header từng cột thể hiện các nội dung tương ứng. Dưới đây là vài cái thông tin thường gặp ở các cột này.

# lsof
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
init 1 root cwd DIR 253,0 4096 2 /
init 1 root rtd DIR 253,0 4096 2 /
init 1 root txt REG 253,0 145180 147164 /sbin/init


Chú thích output của chương trình lệnh

– COMMAND : 9 kí tự đầu tiên của tên chương trình lệnh tương ứng với tiến trình.
– PID : thông tin PID của tiến trình.
– USER : user thực thi tiến trình đó. Có thể là UID hoặc username.
– FD : File Descriptor của file được liệt kê, hoặc các thông tin khác hay mode (w,u,r) của file.
+ cwd : là thư mục đang hoạt động của tiến trình
+ txt : program text (code và data)
+ mmap : memory-mapped file
+ rtd : root directory
+ DEL : Linux map file đã bị xoá.
+ w : đang truy cập ghi xuống dữ liệu
+ u : đang truy cập ghi và đọc dữ liệu
+ r : đang truy cập đọc dữ liệu

– TYPE
:
+ REG : file bình thường
+ sock : socket.
+ ipv4/ipv6 : socket ipv4/v6
+ DIR : thư mục

– DEVICE : số đại diện của thiết bị như partition mà file nằm trên partition đó.

– SIZE/OFF : dung lượng của file.
– NODE : số node của file.
– NAME : tên file.

2. Liệt kê các tiến trình đang mở 1 file

– Bạn có thể liệt kê các tiến trình nào đang mở 1 file cụ thể bằng cách đưa đường dẫn file thành tham số sau lệnh.

# lsof /var/log/web/cuongquach.log

COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
web 15278 root 9w REG 252,2 769335141 1047874 cuonguquach.log
web 33480 nginx 9w REG 252,2 769335141 1047874 cuonguquach.log

3. Liệt kê các file được mở bởi 1 tiến trình

– Để liệt kê các file đã được mở bởi 1 tiến trình có thông tin PID cụ thể thì ta thêm option “-p” và chỉ định rõ thông tin PID của tiến trình đó.

# lsof -p 51263
php-fpm 51623 php cwd DIR 252,5 4096 2616327 /home/website/public_html
php-fpm 51623 php rtd DIR 252,2 4096 2 /
php-fpm 51623 php txt REG 252,2 37007108 1704981 /opt/php-fpm/sbin/php-fpm
php-fpm 51623 php mem REG 252,2 154664 1440207 /lib64/ld-2.12.so

4. Liệt kê các file đã được mở bởi 1 user cụ thể

– Ta chỉ cần chỉ định thêm option “-u” và tên user có tồn tại trên hệ thống.

#lsof -u root
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
sshd 1838 root cwd DIR 253,0 4096 2 /
sshd 1838 root rtd DIR 253,0 4096 2 /
sshd 1838 root txt REG 253,0 532336 188129 /usr/sbin/sshd
sshd 1838 root mem REG 253,0 19784 190237 /lib/libdl-2.12.so
sshd 1838 root mem REG 253,0 122436 190247 /lib/libselinux.so.1
sshd 1838 root mem REG 253,0 255968 190256 /lib/libgssapi_krb5.so.2.2
sshd 1838 root mem REG 253,0 874580 190255 /lib/libkrb5.so.3.3

– Bạn cũng có liệt kê đối với user khác nhưng loại trừ 1 user cụ thể nào đó với tham số “^“.

# lsof -u ^root

5. Liệt kê các file đã được mở trong 1 directory

– Với option “+D” thì lsof sẽ tìm cả các thông tin opened-files ở các sub-directory, thư mục con luôn.
– Còn nếu chỉ không muốn tìm cả sub-dir thì chỉ cần xài “+d“.

# lsof +D /var/log

6. Liệt kê các file đã mở theo tên tiến trình

– Ta dùng option “-c” và chỉ định tên tiến trình.

# lsof -c ssh
# lsof -c init

7. Kill tất cả hoạt động của 1 user cụ thể

– Đôi khi bạn muốn tắt hết tiến trình liên quan đến 1 user. Thì câu lệnh sau sẽ giúp bạn làm điều đó. Option “-t” sẽ liệt kê các thông tin PID và không có các output trả về khác.

# kill -9 `lsof -t -u cuongqc`

8. Liệt kê các tiến trình đang lắng nghe trên port cụ thể

– Bạn cần chú ý option “-i” và tham số “:” cùng số port cụ thể.

# lsof -i :25
# lsof -i TCP:80

9. Liệt kê tất cả kết nối TCP/UDP hay IPv4/v6

– Ta dùng option “-i” để liệt kê tất cả các kết nối của giao thức TCP hay UDP.

# lsof -i tcp
# lsof -i udp

– Để hiển thị tất cả các kết nối của hệ thống. Cũng như muốn chỉ định riêng việc liệt kê kết nối từ IPv4 hay v6.

# lsof -i
# lsof -i 4
# lsof -i 6

10. Liệt kê tất cả các file network đang được sử dụng bởi 1 tiến trình

– Ta làm theo câu lệnh sau bằng cách kết hợp các option tương ứng

# lsof -i -a -p 5252
# lsof -i -a -c ssh


Như vậy là đã xong phần hướng dẫn sử dụng lệnh lsof trên Linux rồi nhé các bạn.

Previous article[Nginx] Mẹo cấu hình “if” đồng thời nhiều điều kiện kiểm tra trong Nginx
Next article[Ebook] Download Cambridge IELTS 9 (PDF + 2-Audio) mới nhất
Bạn đang theo dõi website "https://cuongquach.com/" nơi lưu trữ những kiến thức tổng hợp và chia sẻ cá nhân về Quản Trị Hệ Thống Dịch Vụ & Mạng, được xây dựng lại dưới nền tảng kinh nghiệm của bản thân mình, Quách Chí Cường. Hy vọng bạn sẽ thích nơi này !