Đây là loạt bài viết tiếp tục của chúng tôi về các lệnh Linux và trong bài viết này, chúng tôi sẽ xem xét lệnh lsof với các ví dụ thực tế. lsof có nghĩa là 'LiSt Open Files' được sử dụng để tìm ra các tệp đang mở bởi các tiến trình Linux nào.
Như chúng ta đều biết, Linux/Unix xem mọi thứ như là một tệp (ống, ổ cắm, thư mục, thiết bị, v.v.). Một trong những lý do để sử dụng lệnh lsof là khi một ổ đĩa không thể được gỡ bỏ vì nó nói rằng các tệp đang được sử dụng. Với sự trợ giúp của lệnh lsof, chúng ta có thể dễ dàng xác định các tệp đang được sử dụng.
1. Liệt kê Tất cả Các Tệp Đang Mở với Lệnh lsof
Trong ví dụ dưới đây, nó sẽ hiển thị một danh sách dài các tệp mở, một số trong số chúng được trích xuất để hiểu rõ hơn, hiển thị các cột như Command, PID, USER, FD, TYPE, v.v.
# 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
init 1 root mem REG 253,0 1889704 190149 /lib/libc-2.12.so
init 1 root 0u CHR 1,3 0t0 3764 /dev/null
init 1 root 1u CHR 1,3 0t0 3764 /dev/null
init 1 root 2u CHR 1,3 0t0 3764 /dev/null
init 1 root 3r FIFO 0,8 0t0 8449 pipe
init 1 root 4w FIFO 0,8 0t0 8449 pipe
init 1 root 5r DIR 0,10 0 1 inotify
init 1 root 6r DIR 0,10 0 1 inotify
init 1 root 7u unix 0xc1513880 0t0 8450 socket
Các phần và các giá trị của chúng là dễ hiểu tự giải thích. Tuy nhiên, chúng ta sẽ xem xét các cột FD và TYPE một cách cẩn thận hơn.
FD – viết tắt của File descriptor và có thể thấy một số giá trị như:
- cwd thư mục làm việc hiện tại
- rtd thư mục gốc
- txt chương trình văn bản (mã và dữ liệu)
- mem tệp được ánh xạ vào bộ nhớ
Ngoài ra trong cột FD, các số như 1u là mô tả file descriptor thực tế và theo sau là u, r, w của chế độ của nó như:
- r cho quyền truy cập đọc.
- w cho quyền truy cập ghi.
- u cho quyền truy cập đọc và ghi.
TYPE – của các tệp và định danh của chúng.
- DIR – Thư mục
- REG – Tệp thường
- CHR – Tệp ký tự đặc biệt.
- FIFO – First In First Out
2. Liệt kê Các Tệp Đã Mở Theo Người Dùng Cụ Thể
Lệnh dưới đây sẽ hiển thị danh sách tất cả các tệp đã mở của người dùng tecmint.
# lsof -u tecmint
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
sshd 1838 tecmint cwd DIR 253,0 4096 2 /
sshd 1838 tecmint rtd DIR 253,0 4096 2 /
sshd 1838 tecmint txt REG 253,0 532336 188129 /usr/sbin/sshd
sshd 1838 tecmint mem REG 253,0 19784 190237 /lib/libdl-2.12.so
sshd 1838 tecmint mem REG 253,0 122436 190247 /lib/libselinux.so.1
sshd 1838 tecmint mem REG 253,0 255968 190256 /lib/libgssapi_krb5.so.2.2
sshd 1838 tecmint mem REG 253,0 874580 190255 /lib/libkrb5.so.3.3
3. Tìm Các Tiến Trình Đang Chạy Trên Cổng Cụ Thể
Để tìm tất cả các tiến trình Linux đang chạy trên một cổng cụ thể, chỉ cần sử dụng lệnh sau với tùy chọn -i. Ví dụ dưới đây sẽ liệt kê tất cả các tiến trình đang chạy trên cổng 22.
# lsof -i TCP:22
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
sshd 1471 root 3u IPv4 12683 0t0 TCP *:ssh (LISTEN)
sshd 1471 root 4u IPv6 12685 0t0 TCP *:ssh (LISTEN)
4. Liệt Kê Chỉ Các Tệp Mở IPv4 & IPv6
Trong ví dụ dưới đây chỉ hiển thị các tệp mạng IPv4 và IPv6 mở bằng các lệnh riêng biệt.
# lsof -i 4
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
rpcbind 1203 rpc 6u IPv4 11326 0t0 UDP *:sunrpc
rpcbind 1203 rpc 7u IPv4 11330 0t0 UDP *:954
rpcbind 1203 rpc 8u IPv4 11331 0t0 TCP *:sunrpc (LISTEN)
avahi-dae 1241 avahi 13u IPv4 11579 0t0 UDP *:mdns
avahi-dae 1241 avahi 14u IPv4 11580 0t0 UDP *:58600
# lsof -i 6
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
rpcbind 1203 rpc 9u IPv6 11333 0t0 UDP *:sunrpc
rpcbind 1203 rpc 10u IPv6 11335 0t0 UDP *:954
rpcbind 1203 rpc 11u IPv6 11336 0t0 TCP *:sunrpc (LISTEN)
rpc.statd 1277 rpcuser 10u IPv6 11858 0t0 UDP *:55800
rpc.statd 1277 rpcuser 11u IPv6 11862 0t0 TCP *:56428 (LISTEN)
cupsd 1346 root 6u IPv6 12112 0t0 TCP localhost:ipp (LISTEN)
5. Liệt Kê Các Tệp Đã Mở Của Dải Cổng TCP 1-1024
Để liệt kê tất cả các tiến trình đang chạy của các tệp đã mở của dải cổng TCP từ 1 đến 1024.
# lsof -i TCP:1-1024
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
rpcbind 1203 rpc 11u IPv6 11336 0t0 TCP *:sunrpc (LISTEN)
cupsd 1346 root 7u IPv4 12113 0t0 TCP localhost:ipp (LISTEN)
sshd 1471 root 4u IPv6 12685 0t0 TCP *:ssh (LISTEN)
master 1551 root 13u IPv6 12898 0t0 TCP localhost:smtp (LISTEN)
sshd 1834 root 3r IPv4 15101 0t0 TCP 192.168.0.2:ssh->192.168.0.1:conclave-cpp (ESTABLISHED)
sshd 1838 tecmint 3u IPv4 15101 0t0 TCP 192.168.0.2:ssh->192.168.0.1:conclave-cpp (ESTABLISHED)
sshd 1871 root 3r IPv4 15842 0t0 TCP 192.168.0.2:ssh->192.168.0.1:groove (ESTABLISHED)
httpd 1918 root 5u IPv6 15991 0t0 TCP *:http (LISTEN)
httpd 1918 root 7u IPv6 15995 0t0 TCP *:https (LISTEN)
6. Loại Trừ Người Dùng với 'Ký Tự'
Ở đây, chúng tôi đã loại trừ người dùng root. Bạn có thể loại trừ một người dùng cụ thể bằng cách sử dụng '^' với lệnh như đã được hiển thị trên.
# lsof -i -u^root
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
rpcbind 1203 rpc 6u IPv4 11326 0t0 UDP *:sunrpc
rpcbind 1203 rpc 7u IPv4 11330 0t0 UDP *:954
rpcbind 1203 rpc 8u IPv4 11331 0t0 TCP *:sunrpc (LISTEN)
rpcbind 1203 rpc 9u IPv6 11333 0t0 UDP *:sunrpc
rpcbind 1203 rpc 10u IPv6 11335 0t0 UDP *:954
rpcbind 1203 rpc 11u IPv6 11336 0t0 TCP *:sunrpc (LISTEN)
avahi-dae 1241 avahi 13u IPv4 11579 0t0 UDP *:mdns
avahi-dae 1241 avahi 14u IPv4 11580 0t0 UDP *:58600
rpc.statd 1277 rpcuser 5r IPv4 11836 0t0 UDP *:soap-beep
rpc.statd 1277 rpcuser 8u IPv4 11850 0t0 UDP *:55146
rpc.statd 1277 rpcuser 9u IPv4 11854 0t0 TCP *:32981 (LISTEN)
rpc.statd 1277 rpcuser 10u IPv6 11858 0t0 UDP *:55800
rpc.statd 1277 rpcuser 11u IPv6 11862 0t0 TCP *:56428 (LISTEN)
7. Find Out who's Looking What Files and Commands?
Ví dụ dưới đây cho thấy người dùng tecmint đang sử dụng các lệnh như ping và thư mục /etc.
# lsof -i -u tecmint
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
bash 1839 tecmint cwd DIR 253,0 12288 15 /etc
ping 2525 tecmint cwd DIR 253,0 12288 15 /etc
8. Liệt Kê Tất Cả Các Kết Nối Mạng
Lệnh sau với tùy chọn '-i' sẽ hiển thị danh sách tất cả các kết nối mạng:
# lsof -i
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
rpcbind 1203 rpc 6u IPv4 11326 0t0 UDP *:sunrpc
rpcbind 1203 rpc 7u IPv4 11330 0t0 UDP *:954
rpcbind 1203 rpc 11u IPv6 11336 0t0 TCP *:sunrpc (LISTEN)
avahi-dae 1241 avahi 13u IPv4 11579 0t0 UDP *:mdns
avahi-dae 1241 avahi 14u IPv4 11580 0t0 UDP *:58600
rpc.statd 1277 rpcuser 11u IPv6 11862 0t0 TCP *:56428 (LISTEN)
cupsd 1346 root 6u IPv6 12112 0t0 TCP localhost:ipp (LISTEN)
cupsd 1346 root 7u IPv4 12113 0t0 TCP localhost:ipp (LISTEN)
sshd 1471 root 3u IPv4 12683 0t0 TCP *:ssh (LISTEN)
master 1551 root 12u IPv4 12896 0t0 TCP localhost:smtp (LISTEN)
master 1551 root 13u IPv6 12898 0t0 TCP localhost:smtp (LISTEN)
sshd 1834 root 3r IPv4 15101 0t0 TCP 192.168.0.2:ssh->192.168.0.1:conclave-cpp (ESTABLISHED)
httpd 1918 root 5u IPv6 15991 0t0 TCP *:http (LISTEN)
httpd 1918 root 7u IPv6 15995 0t0 TCP *:https (LISTEN)
clock-app 2362 narad 21u IPv4 22591 0t0 TCP 192.168.0.2:45284->www.gov.com:http (CLOSE_WAIT)
chrome 2377 narad 61u IPv4 25862 0t0 TCP 192.168.0.2:33358->maa03s04-in-f3.1e100.net:http (ESTABLISHED)
chrome 2377 narad 80u IPv4 25866 0t0 TCP 192.168.0.2:36405->bom03s01-in-f15.1e100.net:http (ESTABLISHED)
9. Tìm Kiếm Theo PID
Ví dụ dưới đây chỉ hiển thị các tiến trình có PID là 1.
# lsof -p 1
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
init 1 root mem REG 253,0 1889704 190149 /lib/libc-2.12.so
init 1 root mem REG 253,0 142472 189970 /lib/ld-2.12.so
10. Kết thúc tất cả Hoạt động của Người Dùng Cụ thể
Đôi khi bạn có thể phải kết thúc tất cả các tiến trình cho một người dùng cụ thể. Lệnh dưới đây sẽ kết thúc tất cả các tiến trình của người dùng tecmint.
# kill -9 `lsof -t -u tecmint`
Lưu ý: Ở đây, không thể đưa ra ví dụ về tất cả các tùy chọn có sẵn, hướng dẫn này chỉ là để chỉ ra cách sử dụng lệnh lsof. Bạn có thể tham khảo trang man của lệnh lsof để biết thêm thông tin về nó. Hãy chia sẻ nếu bạn thấy bài viết này hữu ích qua hộp bình luận dưới đây.