lsof - membatasi output hanya untuk file fisik - bagaimana?

30

Bagaimana saya memberi tahu jika saya hanya perlu mendaftarkan file fisik (bukan soket, bukan koneksi TCP / IP, hanya file fisik)?

Vladislav Rastrusny
sumber
Pertama, Anda perlu menentukan untuk apa Anda membutuhkannya. Mengatakan "file fisik" terlalu umum. lsof akan memberi Anda file yang telah dibuka dengan deskriptor file. itu akan memberi Anda file yang telah dibuka sebagai file yang dipetakan oleh thread. itu akan memberi Anda file perpustakaan yang telah dibuka oleh proses. semua ini adalah file fisik, tetapi cara mereka digunakan berbeda.
Michael Martinez

Jawaban:

37

Hanya melihat melalui beberapa halaman manual, tampaknya Anda menggunakan perintah:

sudo lsof /

Ini akan mencantumkan semua file yang terbuka di direktori /, yang merupakan segalanya pada sistem file Linux. Baru diuji dan hanya menunjukkan REG dan DIR.

Lebih banyak contoh:

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

0-999 membatasinya ke file dengan nomor deskriptor file.

Dave Drager
sumber
2
Juga akan menyertakan FIFO.
Kyle Brandt
1
Bagus dan sederhana. Jika Anda hanya membutuhkan kolom terakhir, Anda dapat menambahkan | awk {'print $ 9'} Menarik. Saya juga tidak mendapatkan fifo dalam output saya. Fedora 12 dan CentOS 5.3
egorgry
CentOS 5.2 dan Ubuntu 9.04 mengembalikan fifo's untuk saya, bisa menjadi perubahan, tetapi apakah Anda yakin ada fifos? Saya akan menerimanya terlebih dahulu dan memastikan itu ada, daripada mencoba/
Kyle Brandt
Juga, saya hanya melakukan nitpicking, sepertinya dia hanya tidak ingin kebisingan, dan mungkin tidak akan ada banyak fifos.
Kyle Brandt
4
lsof / hanya menyertakan file pada sistem file root. Jika Anda memiliki beberapa sistem file yang terpasang, mereka tidak akan muncul di output. Saya menemukan cara terbaik adalah dengan hanya menggunakan grep.
James
9

Mungkin ada saklar, tetapi jika Anda tidak keberatan memfilternya melalui grep, Anda bisa melakukannya sudo lsof | egrep 'REG|DIR', dengan asumsi "file fisik" yang Anda maksud adalah file dan direktori biasa.

Lihat bagian OUTPUT :: TYPE dari halaman manual man lsofuntuk semua jenis yang mungkin ada di kolom itu.

Kyle Brandt
sumber
24
Mungkin ada saklar, tetapi halaman manualnya berbunyi seperti tesis Phd seseorang ... :)
Cawflands
1
Ya ... pria itu sangat sulit dibaca ...; hal)
Vladislav Rastrusny
Beri komentar itu +1. :)
egorgry
pada server vpn dengan klien yang cukup, lsof tidak akan kembali, jadi greping bukanlah pilihan bagi saya
Ohad Cohen
@OhadCohen lsof akan kembali jika Anda membatasi apa yang dicari. Lihat "FD" di halaman manual (mem, cwd, pd, dll)
Michael Martinez
2

Inilah yang saya lakukan yang bekerja dengan sempurna untuk saya:

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

The -F npilihan untuk lsofakan menyebabkan ia hanya mencetak nama-nama file yang terbuka. Setiap baris output yang memiliki nama file terbuka akan mulai dengan karakter tunggal n diikuti segera oleh namanya . File biasa akan selalu menjadi nama absolut dan berkualifikasi penuh dari file tersebut. Hanya grep ^n/akan memilih baris-baris dengan nama yang dimulai dengan /(yang berarti nama file absolut yang memenuhi syarat); sehingga menghilangkan hal-hal seperti port terbuka, soket, pipa (seperti FIFO), dll. Ini cut -c2-akan menghilangkan karakter pertama, yaitu n, hanya menyisakan nama file. Kemudian akhirnya, sort -uakan menghilangkan entri duplikat.

Satu peringatan, ini akan mencakup file yang tidak teratur selama nama mereka dimulai dengan a /. Misalnya, semua file yang dimulai dengan yang berikut ini akan disertakan:

  • / dev
  • / proc
  • / sys

Dan mungkin ada orang lain tergantung pada OS Anda.

Greg Barrett
sumber