ทางเลือกสำหรับคำสั่ง“ lsof”?


20

ในหลายกรณี "lsof" ไม่ได้ติดตั้งบนเครื่องที่ฉันต้องทำงาน แต่ "function" ของ lsof จะต้องใช้อย่างมาก (เช่นบน AIX) : \

มีแอปพลิเคชั่น "lsof" ใด ๆ ในโลกที่ไม่ใช่หน้าต่างหรือไม่?

อัปเดต: สำหรับตัวอย่าง: ฉันจำเป็นต้องรู้ว่ากระบวนการใดใช้ไดเรกทอรี "/ home / ชื่อผู้ใช้"?


1
กรุณาเจาะจงมากขึ้นได้ไหม คุณมีระบบใดที่นอกเหนือจาก AIX (ซึ่งสนับสนุนโดย lsof) หรือมีการใช้ lsof ประเภทเดียวที่คุณมีอยู่ในใจหรือไม่? โดยทั่วไป: ทำไมไม่ lsof
rozcietrzewiacz

ฉันใช้ลีนุกซ์ 2.6.18-92.el5 GNU, และฉันไม่มี lsof, และฉันไม่มีความสามารถในการใช้ lsof :(
SSH

คำตอบ:


20

ฉันรู้fuserแล้วดูว่ามีอยู่ในระบบของคุณหรือไม่


สิ่งที่ฉันต้องให้ fuser เป็นพารามิเตอร์เพื่อแสดงรายการไฟล์ที่เปิดอยู่ทั้งหมดในระบบ? : โอ้!
LanceBaynes

2
คำสั่งที่สามารถแสดงให้ทุกกระบวนการต้องเปิดไฟล์ในระบบแฟ้มติดตั้งอยู่บนsudo fuser -vm / 2>&1 | awk '$3 ~ /f|F/' | less /ดู man page สำหรับความช่วยเหลือเฉพาะ
enzotib

TY! มันให้ผลลัพธ์ดังนี้: pastebin.com/raw.php?i=2z19g6Rk - ฉัน googled สำหรับมัน แต่ฉันไม่สามารถหาวิธีที่จะออก ex อดีต: "gnome-screensaver" ไม่ใช่ "gnome-screensav" - ดังนั้น ฉันจะเอาท์พุทมันด้วยชื่อคำสั่งแบบกว้างได้อย่างไร? : O
LanceBaynes

มันให้ผลลัพธ์เดียวกันสำหรับ: pastebin.com/raw.php?i=Fe3EJvUv
LanceBaynes

สิ่งนี้:sudo fuser -vm / 2>&1 | awk '$3 ~ /f|F/' | while read user pid flags rest; do printf '%10s %10s %10s %s\n' $user $pid $flags "$(</proc/$pid/cmdline)"; done | less
enzotib

15

Unix Rosetta Stoneเป็นทรัพยากรที่ดีสำหรับชนิดของคำถามนี้ มันกล่าวถึงทางเลือกสำหรับlsof (ดูด้านล่าง) อย่าลืมว่า lsof เป็นแอปพลิเคชั่นมาตรฐานที่แท้จริงสำหรับสิ่งที่มันทำ

หากสิ่งที่คุณต้องการคือการค้นหา ID กระบวนการที่เปิดไฟล์เฉพาะคุณสามารถใช้fuserกับระบบที่สอดคล้องกับ POSIX ใด ๆ

บนระบบปฏิบัติการที่มี/procไดเรกทอรีคุณสามารถค้นหาไฟล์ที่เปิดโดยกระบวนการที่ (กลับจากlsofโหมดที่พบบ่อยที่สุดของการดำเนินงาน) /procผ่านข้อมูลในการ ระบบปฏิบัติการบางระบบมีคำสั่งดังนี้:


8

หากคุณเกิดขึ้นที่จะเรียกใช้ Solaris, ทางเลือกlsofที่ไม่ได้ติดตั้งโดยค่าเริ่มต้นและอาจสำลัก ZFS pfilesเป็น

เช่น:

pfiles /proc/*


2

รุ่นของฉันมีสาธารณูปโภคที่ใช้งานน้อยลงเพียงเล็กน้อย:

for proc_pid in $(find /proc -maxdepth 1 -name "[0-9]*"); do \
    ls -l ${proc_pid}/fd 2>/dev/null \
    | grep -q "$search_term" \
    && echo "${proc_pid#/proc/}"; \
done

เป็นที่ยอมรับว่าอาจไม่รองรับกรณีมุมทั้งหมด แต่ทำงานในกรณีใช้ของฉัน


0

สิ่งนี้ควรทำเคล็ดลับ มันจะให้การแม็พ descriptor ไฟล์ทั้งหมดยกเว้นสิ่งที่:

  • คุณไม่ได้รับอนุญาตให้ดูหรือ
  • ใช้สำหรับไฟล์ที่มีสตริง "ปฏิเสธการอนุญาต"
( find /proc -mindepth 1 -maxdepth 1 \
  | grep -E [0-9]+ | xargs -n 1 -I% find %/fd \
  | xargs ls -l \
  | grep -v "Permission denied" ) 2>/dev/null \
| cut -d' ' -f12- | less

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

exec=sshd
pgrep "$exec" | xargs -n 1 ps -p
pgrep "$exec" | xargs -n 1 -I% find /proc/%/fd | xargs ls -l | cut -d' ' -f12- | less

-2

บางครั้งlsofมีการติดตั้ง/usr/sbin

หาก/usr/sbinไม่ได้เป็นส่วนหนึ่งของคุณ$PATHคุณอาจพลาดคำสั่งติดตั้งแม้

ตรวจสอบด้วย

whereis lsof
lsof: /usr/sbin/lsof /usr/share/man/man8/lsof.8.gz

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