Cách liệt kê các tệp đang mở cho một quy trình trên Linux

Hướng dẫn sử dụng lệnh ‘lsof’ cho một quy trình

Nếu bạn là người thường xuyên sử dụng hệ thống Linux hoặc Unix, chắc chắn bạn đã nghe thấy cụm từ “Trong Linux, mọi thứ đều là một tệp”. Điều này có thể được phân loại là sự đơn giản hóa quá mức của khái niệm nhưng nó chứng tỏ là rất hữu ích để hiểu cách các tệp trong hệ thống Linux hoạt động.

Không phải mọi thứ xuất hiện trong môi trường Linux đều phải là tệp. Đôi khi nó có thể là một quá trình, nó có thể là một tệp đặc biệt đại diện cho thông tin phần cứng, thư mục và những thứ khác.

Hướng dẫn này sẽ hướng dẫn bạn cách tìm tất cả các tệp được mở cho một quy trình cụ thể trong Linux.

Giới thiệu về lsof Yêu cầu

Cái hay của hệ thống Linux là bạn có thể kiểm soát và quản lý toàn bộ hệ thống của mình thông qua thiết bị đầu cuối, miễn là bạn biết rõ các lệnh. Một khi các lệnh được biết đến thì tất cả các tác vụ trên thiết bị đầu cuối sẽ trở thành một bước đệm.

lsof viết tắt của ‘Danh sách các tệp đang mở‘. Khi bạn biết phiên bản dài của lệnh, bạn sẽ rất dễ hiểu và sử dụng lệnh một cách hiệu quả.

Các lsof lệnh hiển thị danh sách các tệp, ổ cắm và đường ống đang mở. Bạn có thể dễ dàng tìm kiếm các tệp đang mở bằng lệnh này. Khi mà lsof lệnh được sử dụng mà không có bất kỳ tùy chọn nào, nó hiển thị tất cả các tệp đang mở liên quan đến các quy trình hoạt động đang chạy.

Ghi chú: Hãy chắc chắn rằng bạn sử dụng sudo trong khi thực hiện các lệnh.

Sử dụng lsof Yêu cầu

Chúng tôi sẽ nghiên cứu đầu ra của lsof lệnh chi tiết. Nghiên cứu lệnh sau.

sudo lsof | ít hơn

Ghi chú: Nếu chúng tôi trực tiếp chạy lsof , đầu ra sẽ rất lớn và có thể tạo ra sự nhầm lẫn khi tiếp tục. Do đó, ở đây tôi đã sử dụng lsof | ít hơn để thuận tiện cho việc hướng dẫn.

Đầu ra:

gaurav @ ubuntu: ~ $ sudo lsof | ít hơn COMMAND PID TID NGƯỜI DÙNG KÍCH THƯỚC THIẾT BỊ LOẠI FD / TÊN SỐ TẮT Kdevtmpfs 31 root cwd DIR 0,6 4400 2 / kdevtmpfs 31 root rtd DIR 0,6 4400 2 / kdevtmpfs 31 root txt không xác định / proc / 31 / exe netns 32 root cwd DIR 8,8 4096 2 / netns 32 root rtd DIR 8,8 4096 2 / netns 32 root txt chưa xác định / proc / 32 / exe rcu_tasks 33 root cwd DIR 8,8 4096 2 / rcu_tasks 33 root rtd DIR 8,8 4096 2 / rcu_tasks 33 root txt chưa biết / proc / 33 / exe kauditd 34 root cwd DIR 8,8 4096 2 / kauditd 34 root rtd DIR 8,8 4096 2 / kauditd 34 root txt không xác định / proc / 34 / exe 

Sau đây là các thuộc tính được hiển thị bằng cách sử dụng lsof yêu cầu.

Tham sốSự miêu tả
Yêu cầuHiển thị tên của lệnh mở tệp.
PIDSố nhận dạng quy trình của quy trình mở tệp.
TIDSố nhận dạng chủ đề. Nó có thể là một chuỗi hoặc một số tác vụ.
Người dùngID người dùng hoặc tên của người dùng là chủ sở hữu của quá trình.
FDHiển thị bộ mô tả tệp của tệp.
LoạiLoại nút được liên kết với tệp.
Thiết bịHiển thị số thiết bị.
Kích thước / TắtHiển thị kích thước của tệp theo byte.
NútHiển thị số inode của thư mục hoặc thư mục mẹ.
TênHiển thị tên của hệ thống tệp nơi đặt tiến trình.

Liệt kê các quy trình

Trước hết, điều quan trọng là bạn phải có được các quy trình đang chạy và ID quy trình tương ứng của chúng. Linux cung cấp nhiều lệnh để liệt kê các tiến trình cùng với các thuộc tính của chúng như PID, người dùng, thư mục, v.v.

Bạn có thể sử dụng các lệnh như đứng đầu, ps, htop, pstree để liệt kê các quy trình trên thiết bị đầu cuối.

Trong suốt hướng dẫn, tôi sẽ sử dụng đứng đầu lệnh để làm như vậy. Các đứng đầu lệnh cung cấp chế độ xem thời gian thực động của một hệ thống đang chạy. Nó cũng hiển thị tất cả các quy trình và luồng hiện đang được quản lý bởi nhân Linux. Nghiên cứu khối cho sẵn dưới đây để kiểm tra kết quả đầu ra của đứng đầu yêu cầu.

Cú pháp:

sudo hàng đầu

Đầu ra:

gaurav @ ubuntu: ~ $ sudo top PID USER PR NI VIRT RES SHR S% CPU% MEM TIME + COMMAND 2703 gaurav 20 0 4286124 1.142g 103584 R 88.2 30.5 87: 48.08 Nội dung Web 1173 mongodb 20 0 288536 6776 3428 S 5.9 0.2 2: 34,41 mongod 13765 gaurav 20 0 2931568 131408 47496 S 5,9 3,3 1: 42,34 Nội dung web 1 gốc 20 0 225904 6824 4900 S 0,0 0,2 0: 27,25 systemd 2 root 20 0 0 0 0 S 0,0 0,0 0: 00,05 kthreadd 4 root 0 -20 0 0 0 I 0.0 0.0 0: 00.00 kworker / 0: 0H 6 root 0 -20 0 0 0 I 0.0 0.0 0: 00.00 mm_percpu_wq 7 root 20 0 0 0 0 S 0.0 0.0 0: 01.89 ksoftirqd / 0 8 root 20 0 0 0 0 I 0.0 0.0 0: 22.32 rcu_sched 9 root 20 0 0 0 0 I 0.0 0.0 0: 00.00 rcu_bh 10 root rt 0 0 0 0 S 0.0 0.0 0: 03.13 di chuyển / 0 

Trong khối trên, chúng ta có thể xem tất cả thông tin liên quan đến quy trình ở một nơi. Từ đây, chúng ta có thể tìm thấy PID của quá trình mà chúng tôi phải hiển thị các tệp đang mở bằng cách sử dụng lsof yêu cầu.

Nhưng nếu bạn muốn tìm ra ID quy trình của chỉ một quy trình cụ thể và tránh các quy trình không mong muốn khác thì hãy sử dụng lệnh sau.

Cú pháp:

sudo top | grep [Process_Name]

Thí dụ:

gaurav @ ubuntu: ~ $ top | thiết bị đầu cuối grep 13819 gaurav 20 0 803336 19728 9160 S 0,3 0,5 0: 53,63 gnome-terminal- 13819 gaurav 20 0 803336 19728 9160 S 1,0 0,5 0: 53,66 gnome-terminal- 13819 gaurav 20 0 803336 19728 9160 S 0,3 0,5 0: 53,67 gnome -terminal- gaurav @ ubuntu: ~ $

Ở đây chúng tôi đã hiển thị cụ thể ID quy trình của quy trình có chuỗi 'terminal' trong tên quy trình. Phương pháp này hữu ích khi bạn không biết tên quy trình hoàn chỉnh hoặc PID.

Hiển thị các tệp đang mở liên quan đến một quá trình sử dụng PID

Trong khối trên, chúng ta đã học cách lấy thông tin liên quan đến quy trình với sự trợ giúp của lệnh top. Bây giờ chúng ta sẽ sử dụng PID tương ứng với bất kỳ quy trình nào trên hệ thống và cố gắng hiển thị danh sách các tệp đang mở liên quan đến quy trình đó bằng cách sử dụng lsof yêu cầu.

Từ đầu ra đã cho ở trên, chúng ta hãy thực hiện quy trình tương ứng với PID 1173 được tô sáng. Chúng tôi sẽ sử dụng lsof -p [PID] lệnh để làm như vậy.

Cú pháp:

sudo lsof -p [PID]

Lệnh này lấy PID của tiến trình làm đầu vào và liệt kê tất cả các tệp tương ứng với PID này.

Đầu ra:

gaurav @ ubuntu: ~ $ sudo lsof -p 1173 lsof: CẢNH BÁO: không thể stat () fuse.gvfsd-fuse tệp hệ thống / run / user / 1000 / gvfs Thông tin đầu ra có thể không đầy đủ. COMMAND PID NGƯỜI DÙNG FD LOẠI THIẾT BỊ KÍCH THƯỚC / TÊN SỐ TÊN mongod 1173 mongodb cwd DIR 8,8 4096 2 / mongod 1173 mongodb rtd DIR 8,8 4096 2 / mongod 1173 mongodb txt REG 8,8 38379496 2885608 / usr / bin / mongod mongod 1173 mongodb mem REG 8,8 71776 2624380 /lib/x86_64-linux-gnu/libnss_myhostname.so.2 mongod 1173 mongodb mem REG 8,8 101168 2624643 /lib/x86_64-linux-gnu/libresolv-2.27.so mongod 1173 mongodb mem REG 8,8 26936 2624439 /lib/x86_64-linux-gnu/libnss_dns-2.27.so mongod 1173 mongodb mem REG 8,8 10160 2626002 /lib/x86_64-linux-gnu/libnss_mdns4_minimal.so.2 mongod 1173 mongodb mem REG 8,8 47568 2624441 /lib/x86_64-linux-gnu/libnss_files-2,27.so mongod 1173 mongodb mem REG 8,8 3004224 2909671 / usr / lib / locale / locale-archive mongod 1173 mongodb mem REG 8,8 2030544 2621501 / lib / x86_64-linux-gnu / libc-2.27.so mongod 1173 mongodb mem REG 8,8 144976 2624627 /lib/x86_64-linux-gnu/libpthread-2.27.so mongod 1173 mongodb mem REG 8,8 96616 2624649 / lib / x86_64-linux-gnu / libgcc_s.so.1 mongod 1173 mongodb me m REG 8,8 1700792 2622735 /lib/x86_64-linux-gnu/libm-2.27.so mongod 1173 mongodb mem REG 8,8 14560 2621535 /lib/x86_64-linux-gnu/libdl-2.27.so mongod 1173 mongodb mem REG 8,8 31680 2624646 /lib/x86_64-linux-gnu/librt-2.27.so mongod 1173 mongodb mem REG 8,8 2357760 2890079 /usr/lib/x86_64-linux-gnu/libcrypto.so.1.0.0 gaurav @ ubuntu : ~ $

Các tệp đang mở cho quy trình có ID quy trình 1713 được hiển thị bằng cách sử dụng lsof yêu cầu.

Ghi chú: Người dùng GNOME có thể gặp cảnh báo dưới đây. Bạn có thể bỏ qua nó một cách an toàn.

lsof: CẢNH BÁO: không thể stat () fuse.gvfsd-fuse file system / run / user / 1000 / gvfs Thông tin đầu ra có thể không đầy đủ.

Liệt kê các tệp đang mở liên quan đến một quy trình bằng cách sử dụng tên quy trình

Các lsof lệnh cũng cung cấp cho bạn một tùy chọn để liệt kê các tệp đang mở bằng cách sử dụng tên của các quy trình. Các tên phải được cung cấp cho lệnh dưới dạng một chuỗi đầu vào. Xem cú pháp bên dưới để sử dụng tùy chọn này.

Cú pháp:

sudo lsof -c [Tên quy trình]

Thí dụ:

sudo lsof -c mysql

Đầu ra:

gaurav @ ubuntu: ~ $ sudo lsof -c mysql lsof: CẢNH BÁO: không thể stat () fuse.gvfsd-fuse tệp hệ thống / run / user / 1000 / gvfs Thông tin đầu ra có thể không đầy đủ. COMMAND PID NGƯỜI DÙNG FD LOẠI THIẾT BỊ KÍCH THƯỚC / TÊN SỐ MÃ TÊN mysqld 1266 mysql cwd DIR 8,8 4096 3154135 / var / lib / mysql mysqld 1266 mysql rtd DIR 8,8 4096 2 / mysqld 1266 mysql txt REG 8,8 24691368 2889411 / usr / sbin / mysqld mysqld 1266 mysql mem REG 8,8 6288 5505444 /usr/lib/mysql/plugin/auth_socket.so mysqld 1266 mysql DEL REG 0,18 28127 / [aio] mysqld 1266 mysql DEL REG 0,18 28126 / [ aio] mysqld 1266 mysql DEL REG 0,18 28125 / [aio] mysql 1266 mysql mem REG 8,8 47568 2624441 /lib/x86_64-linux-gnu/libnss_files-2,27.so mysqld 1266 mysql mem REG 8,8 47576 2624592 / lib / x86_64-linux-gnu / libnss_nis-2.27.so mysqld 1266 mysql mem REG 8,8 39744 2624438 /lib/x86_64-linux-gnu/libnss_compat-2.27.so 

Đầu ra sẽ giống như đầu ra mà trong đó ID quy trình được sử dụng thay vì tên Quy trình.

Tệp danh sách được mở bằng kết nối mạng

Trong Linux, các tệp cũng có thể ở dạng thông tin về kết nối mạng, kết nối phần cứng của bạn, v.v. Chúng tôi có thể sử dụng lsof lệnh liệt kê các tệp được mở bằng kết nối mạng. Sử dụng phương pháp sau.

sudo lsof -i

Đầu ra:

gaurav @ ubuntu: ~ $ sudo lsof -i LỆNH PID NGƯỜI DÙNG FD LOẠI THIẾT BỊ KÍCH THƯỚC / TẮT NODE TÊN systemd-r 969 systemd-Resolution 12u IPv4 17357 0t0 UDP localhost: domain systemd-r 969 systemd-Resolution 13u IPv4 17358 0t0 TCP localhost: domain (LISTEN) systemd-r 969 systemd-Resolution 15u IPv4 1685575 0t0 UDP ubuntu: 48090 -> _ gateway: domain avahi-dae 1028 avahi 12u IPv4 23810 0t0 UDP *: mdns avahi-dae 1028 avahi 13u IPv6 23811 0t0 UDP *: mdns avahi-dae 1028 avahi 14u IPv4 23812 0t0 UDP *: 58999 avahi-dae 1028 avahi 15u IPv6 23813 0t0 UDP *: 37512 mongod 1173 mongodb 6u IPv4 28149 0t0 TCP localhost: 27017 (LISTEN) mysqld 1266 mysql 19u IPtv4 2599host2 0 IPtv4 mysql (LISTEN) apache2 1283 root 4u IPv6 28140 0t0 TCP *: http (LISTEN) gaurav @ ubuntu: ~ $

Tại đây, chúng ta có thể xem thông tin về các tệp được mở bằng kết nối mạng bằng cách sử dụng lsof -i yêu cầu.

Sự kết luận

Trong hướng dẫn đơn giản này, chúng ta đã học cách liệt kê các tệp đang mở cho một tiến trình trong Linux bằng nhiều phương pháp dễ sử dụng. Để biết thêm cách sử dụng lsof lệnh, xem lsof trang người đàn ông.