Hôm nay mình sẽ chỉ cho các bạn cách sử dụng chương trình lệnh Linux “lsof” 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.
Contents
- 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
- 2. Liệt kê các tiến trình đang mở 1 file
- 3. Liệt kê các file được mở bởi 1 tiến trình
- 4. Liệt kê các file đã được mở bởi 1 user cụ thể
- 5. Liệt kê các file đã được mở trong 1 directory
- 6. Liệt kê các file đã mở theo tên tiến trình
- 7. Kill tất cả hoạt động của 1 user cụ thể
- 8. Liệt kê các tiến trình đang lắng nghe trên port cụ thể
- 9. Liệt kê tất cả kết nối TCP/UDP hay IPv4/v6
- 10. Liệt kê tất cả các file network đang được sử dụng bởi 1 tiến trình
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.