Alternatif untuk perintah "lsof"?

20

Dalam banyak kasus "lsof" tidak diinstal pada mesin yang dengan saya harus bekerja, tetapi "fungsi" lsof akan sangat dibutuhkan (mis. Pada AIX). : \

Apakah ada "lsof" seperti aplikasi di dunia non-windows?

UPDATE: for ex .: Saya perlu tahu bahwa proses apa yang menggunakan direktori "/ home / nama pengguna"?

LanceBaynes
sumber
1
Bisakah Anda lebih spesifik? Sistem apa yang terpisah dari AIX (yang tentunya didukung oleh lsof) yang ada dalam pikiran Anda? Atau hanya ada satu jenis penggunaan khusus yang ada dalam pikiran Anda? Umumnya: mengapa tidak lsof?
rozcietrzewiacz
Saya menggunakan Linux 2.6.18-92.el5 GNU, dan saya tidak memiliki lsof, saya juga tidak memiliki kemampuan untuk menggunakan lsof :(
SSH This
Pertanyaan terkait: bagaimana cara memeriksa file terbuka tanpa lsof
Stéphane Gourichon

Jawaban:

20

Saya tahu fuser, lihat apakah tersedia di sistem Anda.

enzotib
sumber
apa yang harus saya berikan fuser sebagai parameter untuk mendaftar semua file yang terbuka pada suatu sistem? : O ty!
LanceBaynes
2
Perintah sudo fuser -vm / 2>&1 | awk '$3 ~ /f|F/' | lessdapat menunjukkan semua proses memiliki file terbuka di sistem file yang terpasang /. Lihat halaman manual untuk bantuan spesifik.
enzotib
TY! itu memberikan output seperti ini: pastebin.com/raw.php?i=2z19g6Rk - saya googled untuk itu, tetapi saya tidak dapat menemukan cara untuk output ex .: "gnome-screensaver", bukan "gnome-screensav" - jadi bagaimana saya bisa mengeluarkannya dengan nama perintah lebar? : O
LanceBaynes
itu memberikan hasil yang sama untuk: pastebin.com/raw.php?i=Fe3EJvUv
LanceBaynes
Sesuatu seperti ini: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

The Unix Rosetta Stone adalah sumber yang baik untuk jenis pertanyaan. Ini menyebutkan beberapa alternatif untuk lsof (lihat di bawah). Namun perlu dicatat bahwa lsof adalah aplikasi standar de facto untuk apa yang dilakukannya.

Jika yang Anda inginkan adalah menemukan ID proses yang memiliki file tertentu terbuka, maka Anda dapat menggunakannya fuserpada sistem yang mendukung POSIX.

Pada sistem operasi dengan /procdirektori, Anda dapat meminta file dibuka dengan proses (kebalikan dari lsofmode operasi yang paling umum) melalui informasi di /proc. Beberapa sistem operasi memiliki perintah untuk itu:

Gilles 'SANGAT berhenti menjadi jahat'
sumber
8

Jika Anda menjalankan Solaris, alternatif untuk lsof, yang tidak diinstal secara default dan mungkin tercekik pada ZFS, adalah pfiles.

misalnya:

pfiles /proc/*

Jlliagre
sumber
2

Versi saya, dengan hanya sedikit utilitas yang kurang berjalan:

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

Memang, ini mungkin tidak menangani semua kasus sudut, tetapi bekerja dalam kasus penggunaan saya.

Bryce Schober
sumber
0

Ini harus melakukan trik. Ini akan memberikan semua pemetaan file descriptor kecuali yang:

  • Anda tidak memiliki izin untuk melihat, atau
  • untuk file yang berisi string "Izin ditolak"
( 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

Jika Anda sudah tahu bahwa Anda hanya peduli dengan pemetaan untuk program tertentu, Anda bisa menggunakan sesuatu yang lebih sesuai:

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
Tembakan Parthian
sumber
-2

Terkadang lsofdipasang di/usr/sbin

Jika /usr/sbinbukan bagian dari Anda $PATH, Anda bisa melewatkan perintah bahkan diinstal.

Periksa dengan

whereis lsof
lsof: /usr/sbin/lsof /usr/share/man/man8/lsof.8.gz
Sejuk
sumber
OP mengatakan bahwa lsof tidak diinstal dan meminta alternatif ...
Jeff Schaller