lsof - จำกัด เอาต์พุตไปยังฟิสิคัลไฟล์เท่านั้น - อย่างไร


30

ฉันจะบอกได้อย่างไรว่าฉันต้องการแสดงรายการไฟล์ทางกายภาพเท่านั้น (ไม่ใช่ซ็อกเก็ต, ไม่ใช่การเชื่อมต่อ TCP / IP, ไฟล์ทางกายภาพเท่านั้น)


ก่อนอื่นคุณต้องกำหนดสิ่งที่คุณต้องการ ในการพูดว่า "ไฟล์ทางกายภาพ" นั้นกว้างเกินไป lsof จะให้ไฟล์ที่ถูกเปิดด้วย file descriptor มันจะให้ไฟล์ที่ถูกเปิดเป็นไฟล์ที่แม็พหน่วยความจำโดยเธรด มันจะให้ไฟล์ไลบรารีที่เปิดโดย proceses ทั้งหมดนี้เป็นไฟล์จริง แต่วิธีการใช้งานนั้นแตกต่างกัน
Michael Martinez

คำตอบ:


37

เพียงแค่อ่านหน้าคู่มือบางหน้ามันก็ปรากฏว่าคุณใช้คำสั่ง:

sudo lsof /

นี่จะแสดงรายการไฟล์ที่เปิดทั้งหมดในไดเรกทอรี / ซึ่งเป็นทุกอย่างในระบบไฟล์ Linux เพิ่งทดสอบและมันจะแสดงเฉพาะ REG และ DIR

ตัวอย่างเพิ่มเติม:

lsof -a -d 0-999 -c <command name> /
lsof -a -d 0-999 -p <pid> /

0-999 จำกัด เฉพาะไฟล์ที่มีหมายเลขตัวอธิบายไฟล์


2
จะรวมถึง FIFO เช่นกัน
Kyle Brandt

1
ดีและเรียบง่าย หากคุณต้องการแค่คอลัมน์สุดท้ายคุณสามารถผนวก | awk {'print $ 9'} น่าสนใจ ฉันไม่ได้รับ Fifo ในผลลัพธ์ของฉันด้วย Fedora 12 และ CentOS 5.3
egorgry

CentOS 5.2 และ Ubuntu 9.04 คืน Fifo's สำหรับฉันอาจเป็นการเปลี่ยนแปลง แต่คุณแน่ใจหรือว่ามี Fifos? ฉันจะ grep มันก่อนและให้แน่ใจว่ามันอยู่ที่นั่นมากกว่าลอง/
Kyle Brandt

นอกจากนี้ฉันยังเป็นเพียงแค่ nitpicking ดูเหมือนว่าเขาไม่ต้องการเสียงรบกวนและอาจจะมีฟีฟ่าไม่มากนัก
Kyle Brandt

4
lsof / รวมเฉพาะไฟล์บนระบบไฟล์รูท หากคุณติดตั้งระบบไฟล์หลายระบบไฟล์เหล่านั้นจะไม่ปรากฏในเอาต์พุต ฉันพบว่าวิธีที่ดีที่สุดคือใช้ grep
James

9

อาจมีสวิตช์ แต่ถ้าคุณไม่คำนึงถึงการกรองผ่าน grep คุณสามารถทำได้sudo lsof | egrep 'REG|DIR'โดยสมมติว่า "ฟิสิคัลไฟล์" คุณหมายถึงไฟล์และไดเรกทอรีปกติ

ดูส่วน OUTPUT :: TYPE ของ man page man lsofสำหรับประเภททั้งหมดที่อาจอยู่ในคอลัมน์นั้น


24
อาจจะมีสวิทช์ แต่ manpage อ่านเช่นวิทยานิพนธ์ปริญญาเอกของใครบางคน ... :)
Cawflands

1
ใช่แล้วชายคนนี้อ่านยากมาก ... ; p)
Vladislav Rastrusny

+1 ที่แสดงความคิดเห็น :)
egorgry

บนเซิร์ฟเวอร์ VPN ที่มีลูกค้าเพียงพอ lsof จะไม่ส่งคืนดังนั้น greping จึงไม่ใช่ตัวเลือกสำหรับฉัน
Ohad Cohen

@OhadCohen lsof จะกลับมาถ้าคุณ จำกัด สิ่งที่ต้องการ ดู "FD" ใน manpage (mem, cwd, pd, ฯลฯ )
Michael Martinez

2

นี่คือสิ่งที่ฉันทำซึ่งทำงานได้อย่างสมบูรณ์แบบสำหรับฉัน:

lsof -F n -p 12501 | grep ^n/ | cut -c2- | sort -u

-F nตัวเลือกในการlsofจะทำให้มันเพียงพิมพ์ชื่อของไฟล์ที่เปิด แต่ละบรรทัดเอาต์พุตที่มีชื่อของไฟล์ที่เปิดจะเริ่มต้นด้วยตัวอักษรnตามด้วยชื่อทันที ไฟล์ปกติจะเป็นชื่อที่สมบูรณ์และผ่านการรับรองของไฟล์เสมอ grep ^n/จะเลือกเฉพาะเส้นที่มีชื่อขึ้นต้นด้วย/(หมายถึงแน่นอนชื่อไฟล์ที่มีคุณสมบัติครบถ้วน); ดังนั้นการกำจัดสิ่งต่าง ๆ เช่นพอร์ตที่เปิดซ็อกเก็ตไปป์ (เช่น FIFO) ฯลฯcut -c2-จะกำจัดอักขระตัวแรกที่nเหลือเพียงชื่อไฟล์เท่านั้น จากนั้นในที่สุดก็sort -uจะกำจัดรายการที่ซ้ำกัน

คำเตือนนี้จะรวมถึงไฟล์ที่ไม่ปกติ/ตราบใดที่เริ่มต้นชื่อของพวกเขาด้วย ตัวอย่างเช่นไฟล์ทั้งหมดที่เริ่มต้นด้วยสิ่งต่อไปนี้จะรวมอยู่ด้วย:

  • / dev
  • proc /
  • sys /

และอาจมีบางอย่างขึ้นอยู่กับระบบปฏิบัติการของคุณ

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.