วิธีการแสดงรายการไฟล์ที่เปิดสำหรับกระบวนการบน Linux

คำแนะนำในการใช้คำสั่ง 'lsof' สำหรับกระบวนการ

หากคุณเป็นผู้ใช้ระบบ Linux หรือ Unix บ่อยครั้ง คุณต้องเคยได้ยินวลีนี้อย่างแน่นอน “ใน Linux ทุกอย่างเป็นไฟล์” สิ่งนี้อาจจัดอยู่ในประเภทการทำให้แนวคิดเข้าใจง่ายเกินไป แต่ก็พิสูจน์ได้ว่ามีประโยชน์มากในการทำความเข้าใจวิธีการทำงานของไฟล์ในระบบ Linux

ไม่ใช่ทุกสิ่งที่ปรากฏในสภาพแวดล้อม Linux จะต้องเป็นไฟล์ บางครั้งอาจเป็นกระบวนการ อาจเป็นไฟล์พิเศษที่แสดงข้อมูลฮาร์ดแวร์ ไดเรกทอรี และอื่นๆ

บทช่วยสอนนี้จะแนะนำคุณในการค้นหาไฟล์ทั้งหมดที่เปิดสำหรับกระบวนการเฉพาะใน Linux

บทนำสู่ lsof สั่งการ

ข้อดีของระบบ Linux คือ คุณสามารถควบคุมและจัดการระบบทั้งหมดของคุณผ่านเทอร์มินัลได้ โดยที่คุณต้องรู้คำสั่งต่างๆ เป็นอย่างดี เมื่อทราบคำสั่งแล้ว งานทั้งหมดบนเครื่องเทอร์มินัลจะกลายเป็นเค้กวอล์ค

lsof หมายถึง 'รายการไฟล์ที่เปิดอยู่'. เมื่อคุณทราบเวอร์ชันยาวของคำสั่งแล้ว จะกลายเป็นเรื่องง่ายมากสำหรับคุณที่จะเข้าใจและใช้คำสั่งในลักษณะที่มีประสิทธิผล

ดิ lsof คำสั่งแสดงรายการไฟล์ที่เปิดอยู่ ซ็อกเก็ต และไพพ์ คุณสามารถค้นหาไฟล์ที่เปิดอยู่ได้อย่างง่ายดายโดยใช้คำสั่งนี้ เมื่อ lsof คำสั่งถูกใช้โดยไม่มีตัวเลือกใด ๆ จะแสดงไฟล์ที่เปิดอยู่ทั้งหมดที่เกี่ยวข้องกับกระบวนการที่ทำงานอยู่ซึ่งกำลังทำงานอยู่

บันทึก: ให้แน่ใจว่าคุณใช้ sudo ขณะดำเนินการคำสั่ง

ใช้ lsof สั่งการ

เราจะศึกษาผลลัพธ์ของ lsof คำสั่งอย่างละเอียด ศึกษาคำสั่งต่อไปนี้

sudo lsof | น้อย

บันทึก: ถ้าเราเรียกใช้ .โดยตรง lsof คำสั่งเอาต์พุตจะมีขนาดใหญ่มากและอาจสร้างความสับสนในการดำเนินการต่อไป ฉันจึงใช้ที่นี่ lsof | น้อย คำสั่งเพื่อความสะดวกในการกวดวิชา

เอาท์พุท:

gaurav@ubuntu:~$ sudo lsof | น้อยกว่า คำสั่ง PID TID ผู้ใช้ FD ประเภทอุปกรณ์ ขนาด/ปิด ชื่อโหนด kdevtmpfs 31 รูท cwd DIR 0,6 4400 2 / kdevtmpfs 31 รูท rtd DIR 0,6 4400 2 / kdevtmpfs 31 รูท txt ที่ไม่รู้จัก /proc/31/exe netns 32 รูท cwd DIR 8,8 4096 2 / netns 32 รูท rtd DIR 8,8 4096 2 / netns 32 รูท txt ที่ไม่รู้จัก /proc/32/exe rcu_tasks 33 รูท cwd DIR 8,8 4096 2 / rcu_tasks 33 รูท rtd DIR 8,8 4096 2 / rcu_tasks 33 รูท txt ที่ไม่รู้จัก /proc/33/exe kauditd 34 รูท cwd DIR 8,8 4096 2 / kauditd 34 รูท rtd DIR 8,8 4096 2 / kauditd 34 รูท txt ที่ไม่รู้จัก /proc/34/exe 

ต่อไปนี้เป็นแอตทริบิวต์ที่แสดงโดยใช้เครื่องหมาย lsof สั่งการ.

พารามิเตอร์คำอธิบาย
สั่งการแสดงชื่อของคำสั่งที่เปิดไฟล์
PIDหมายเลขตัวระบุกระบวนการของกระบวนการที่เปิดไฟล์
TIDหมายเลขระบุเธรด อาจเป็นเธรดหรือหมายเลขงานก็ได้
ผู้ใช้ID ผู้ใช้หรือชื่อผู้ใช้ที่เป็นเจ้าของกระบวนการ
FDแสดงคำอธิบายไฟล์ของไฟล์
พิมพ์ประเภทของโหนดที่เกี่ยวข้องกับไฟล์
อุปกรณ์แสดงหมายเลขอุปกรณ์
ขนาด/ปิดแสดงขนาดของไฟล์เป็นไบต์
โหนดแสดงหมายเลขไอโหนดของไดเร็กทอรีหรือไดเร็กทอรีหลัก
ชื่อแสดงชื่อระบบไฟล์ที่กระบวนการตั้งอยู่

รายชื่อกระบวนการ

อันดับแรก เป็นสิ่งสำคัญสำหรับคุณที่จะได้รับกระบวนการที่กำลังทำงานและ ID กระบวนการที่เกี่ยวข้อง Linux มีคำสั่งที่หลากหลายเพื่อแสดงรายการกระบวนการพร้อมกับแอตทริบิวต์เช่น PID ผู้ใช้ ไดเร็กทอรี ฯลฯ

คุณสามารถใช้คำสั่งเช่น สูงสุด, ปล, htop, pstree เพื่อแสดงรายการกระบวนการบนเทอร์มินัล

ตลอดบทช่วยสอน ฉันจะใช้ สูงสุด สั่งให้ทำเช่นนั้น ดิ สูงสุด คำสั่งให้มุมมองแบบเรียลไทม์แบบไดนามิกของระบบที่ทำงานอยู่ นอกจากนี้ยังแสดงกระบวนการและเธรดทั้งหมดที่กำลังจัดการโดยเคอร์เนล Linux ศึกษาบล็อกที่ระบุด้านล่างเพื่อตรวจสอบผลลัพธ์ของ สูงสุด สั่งการ.

ไวยากรณ์:

sudo ท็อป

เอาท์พุท:

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 Web Content 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 Web Content 1 root 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 ฉัน 0.0 0.0 0:00.00 kworker/0:0H 6 ราก 0 -20 0 0 0 ฉัน 0.0 0.0 0:00.00 mm_percpu_wq 7 ราก 20 0 0 0 0 S 0.0 0.0 0:01.89 ksoftirqd/0 8 ราก 20 0 0 0 0 ฉัน 0.0 0.0 0:22.32 rcu_sched 9 ราก 20 0 0 0 0 ฉัน 0.0 0.0 0:00.00 rcu_bh 10 ราก rt 0 0 0 0 S 0.0 0.0 0:03.13 การย้ายถิ่น/0 

ในบล็อกด้านบนนี้ เราจะเห็นข้อมูลที่เกี่ยวข้องกับกระบวนการทั้งหมดได้ในที่เดียว จากที่นี่เราจะพบ PID ของกระบวนการที่เราต้องแสดงไฟล์ที่เปิดอยู่โดยใช้ lsof สั่งการ.

แต่ถ้าคุณต้องการค้นหา ID กระบวนการของกระบวนการเฉพาะและหลีกเลี่ยงกระบวนการที่ไม่ต้องการอื่น ๆ ให้ใช้คำสั่งต่อไปนี้

ไวยากรณ์:

sudo ด้านบน | grep [Process_Name]

ตัวอย่าง:

gaurav@ubuntu:~$ top | เทอร์มินัล 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:~$

ที่นี่เราได้แสดงรหัสกระบวนการของกระบวนการโดยเฉพาะซึ่งมีสตริง 'เทอร์มินัล' ในชื่อกระบวนการ วิธีนี้มีประโยชน์เมื่อคุณไม่ทราบชื่อกระบวนการทั้งหมดหรือ PID

การแสดงไฟล์ที่เปิดอยู่ที่เกี่ยวข้องกับกระบวนการโดยใช้ PID

ในบล็อกข้างต้น เราได้เรียนรู้วิธีการรับข้อมูลที่เกี่ยวข้องกับกระบวนการด้วยความช่วยเหลือของคำสั่งบนสุด ตอนนี้เราจะใช้ PID สอดคล้องกับกระบวนการใด ๆ ในระบบและพยายามแสดงรายการไฟล์ที่เปิดอยู่ที่เกี่ยวข้องกับกระบวนการนั้นโดยใช้ lsof สั่งการ.

จากผลลัพธ์ข้างต้น ให้เราใช้กระบวนการที่สอดคล้องกับ PID 1173 ซึ่งถูกเน้นไว้ เราจะใช้ lsof -p [PID] สั่งให้ทำเช่นนั้น

ไวยากรณ์:

sudo lsof -p [PID]

คำสั่งนี้ใช้ PID ของกระบวนการเป็นอินพุตและแสดงรายการไฟล์ทั้งหมดที่สอดคล้องกับ PID นี้

เอาท์พุท:

gaurav@ubuntu:~$ sudo lsof -p 1173 lsof: WARNING: can't stat() fuse.gvfsd-fuse file system /run/user/1000/gvfs ข้อมูลเอาต์พุตอาจไม่สมบูรณ์ คำสั่ง PID ผู้ใช้ FD ประเภทอุปกรณ์ ขนาด/ปิด ชื่อโหนด 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/bingod 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 หน่วยความจำ 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 mongodb 1173 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 ฉัน 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 :~$

ไฟล์ที่เปิดสำหรับกระบวนการที่มี ID กระบวนการ 1713 จะแสดงโดยใช้ปุ่ม lsof สั่งการ.

บันทึก: ผู้ใช้ GNOME อาจพบคำเตือนด้านล่าง คุณสามารถละเลยได้อย่างปลอดภัย

lsof: คำเตือน: can't stat() fuse.gvfsd-fuse file system /run/user/1000/gvfs ข้อมูลเอาต์พุตอาจไม่สมบูรณ์

แสดงรายการไฟล์ที่เปิดอยู่ที่เกี่ยวข้องกับกระบวนการโดยใช้ชื่อกระบวนการ

ดิ lsof คำสั่งยังให้คุณมีตัวเลือกในการแสดงรายการไฟล์ที่เปิดอยู่โดยใช้ชื่อของกระบวนการ ควรระบุชื่อให้กับคำสั่งเป็นสตริงอินพุต ดูไวยากรณ์ด้านล่างเพื่อใช้ตัวเลือกนี้

ไวยากรณ์:

sudo lsof -c [ชื่อกระบวนการ]

ตัวอย่าง:

sudo lsof -c mysql

เอาท์พุท:

gaurav@ubuntu:~$ sudo lsof -c mysql lsof: คำเตือน: can't stat() fuse.gvfsd-fuse ระบบไฟล์ /run/user/1000/gvfs ข้อมูลเอาต์พุตอาจไม่สมบูรณ์ คำสั่ง PID ผู้ใช้ FD ประเภทอุปกรณ์ ขนาด/ปิด ชื่อโหนด 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,82894 246913 /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] mysqld 1266 mysql mem REG 8,8 47568 2624441 /lib/x86_64-linux-gnu/libnss_files-2.27.so mysqld 1266 mysql mem REG 8,928 47576 26245 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 

ผลลัพธ์จะเป็นแบบเดียวกับที่ใช้ Process ID แทนชื่อ Process

รายการไฟล์ที่เปิดโดยการเชื่อมต่อเครือข่าย

ใน Linux ไฟล์ยังสามารถอยู่ในรูปแบบของข้อมูลเกี่ยวกับการเชื่อมต่อเครือข่ายของคุณ การเชื่อมต่อฮาร์ดแวร์ ฯลฯ เราสามารถใช้ lsof คำสั่งแสดงรายการไฟล์ที่เปิดโดยการเชื่อมต่อเครือข่าย ใช้วิธีการต่อไปนี้

sudo lsof -i

เอาท์พุท:

gaurav@ubuntu:~$ sudo lsof -i คำสั่ง PID ผู้ใช้ FD ประเภทอุปกรณ์ ขนาด/ปิดชื่อโหนด systemd-r 969 systemd-resolve 12u IPv4 17357 0t0 UDP localhost:domain systemd-r 969 systemd-resolve 13u IPv4 17358 0t0 TCP localhost โดเมน (ฟัง) systemd-r 969 systemd-resolve 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 2 *3811 0mdns UDP 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 (ฟัง) mysqld 1266 mysql0 ในพื้นที่ mysql (ฟัง) apache2 1283 รูท 4u IPv6 28140 0t0 TCP *:http (ฟัง) gaurav@ubuntu:~$

ที่นี่เราสามารถดูข้อมูลเกี่ยวกับไฟล์ที่เปิดโดยการเชื่อมต่อเครือข่ายโดยใช้ lsof -i สั่งการ.

บทสรุป

ในบทช่วยสอนง่ายๆ นี้ เราได้เรียนรู้วิธีแสดงรายการไฟล์ที่เปิดสำหรับกระบวนการใน Linux โดยใช้วิธีการต่างๆ ที่ใช้งานง่าย สำหรับการใช้งานเพิ่มเติมของ lsof คำสั่ง ดู lsof หน้าคน.