Cara menampilkan deskriptor file yang terbuka tetapi tidak menggunakan perintah lsof

48

Hai Saya telah membaca Di Sini bahwa lsof bukan cara yang akurat untuk mendapatkan jumlah File Deskriptor yang saat ini terbuka. Dia merekomendasikan untuk menggunakan perintah ini sebagai gantinya

 cat /proc/sys/fs/file-nr

Sementara perintah ini menampilkan jumlah FD, bagaimana Anda menampilkan daftar deskriptor file terbuka yang hanya dihitung oleh perintah di atas?

dimas
sumber
4
Anda mungkin ingin tahu apakah ulimit Anda terlampaui, kan? Saya membuat blog tentang ini di linuxintro.org/wiki/Is_my_ulimit_exceeded ; yang paling penting, ulimit adalah pembatasan per proses yang dapat Anda temukan di bawah / proc / PID / limit dan bukannya lsof saya akan menggunakan ls / proc / PID / fd untuk mendaftar deskriptor file proses.
Thorsten Staerk

Jawaban:

60

Ada dua alasan mengapa lsof | wc -lpenghitungan file tidak dihitung. Salah satunya adalah ia mencantumkan hal-hal yang tidak membuka file, seperti perpustakaan yang terhubung secara dinamis dan direktori kerja saat ini; Anda perlu memfilternya. Lain adalah yang lsofmembutuhkan waktu untuk berjalan, sehingga dapat kehilangan file yang dibuka atau ditutup saat sedang berjalan; oleh karena itu jumlah file terbuka yang terdaftar adalah perkiraan. Melihat /proc/sys/fs/file-nrmemberi Anda nilai tepat pada titik waktu tertentu.

cat /proc/sys/fs/file-nrhanya berguna ketika Anda membutuhkan angka yang tepat, terutama untuk memeriksa kelelahan sumber daya. Jika Anda ingin membuat daftar file yang terbuka, Anda perlu menelepon lsof, atau menggunakan beberapa metode yang setara seperti menjambret /proc/*/fdsecara manual.

Gilles 'SANGAT berhenti menjadi jahat'
sumber
1
Hai, terima kasih telah memberikan penjelasan yang bagus, Gilles. Saya mencoba ls / proc / * / fd dan mendapatkan semua fd terbuka saat itu. Ini menghasilkan output dengan beberapa kode warna, saya hanya perlu melihat manualnya.
dimas
/proc/*/fdDirektori @dimas berisi tautan simbolik ke file yang terbuka. Untuk inspeksi visual, gunakan ls -l. Untuk perawatan otomatis, gunakan readlinkuntuk mengekstrak target tautan.
Gilles 'SO- stop being evil'
Cukup gunakan ls-l tetapi saya akan bereksperimen dengan readlink. Saya mencoba / proc / PID / maps lain dan opsi lain seperti yang ditentukan di sini kernel.org/doc/man-pages/online/pages/man5/proc.5.html . Sekali lagi terima kasih atas info tambahannya.
dimas
1
/ proc / sys / fs / file-nr memberi saya 3872 (dan dua nomor lainnya). Bagaimana ini bisa menjadi jumlah file yang saya buka jika ulimit -n menunjukkan 1024?
Thorsten Staerk
1
@ThorstenStaerk Semua pengaturan setrlimit(panggilan sistem yang mendasari ulimitperintah shell) adalah per-proses. Mereka hanya mempengaruhi proses yang membuat panggilan (dan secara tidak langsung proses yang kemudian garpu).
Gilles 'SO- stop being evil'
25

Proses informasi disimpan secara dinamis oleh sistem dalam direktori di bawah / proc. Misalnya proses dengan PID 1234 akan memiliki direktori bernama / proc / 1234.

Ada sedikit informasi di sana, tetapi saat ini Anda tertarik pada subdirektori / proc / 1234 / fd .

CATATAN: Anda harus memiliki izin root untuk melihat atau membuka file untuk proses yang tidak Anda miliki, serta untuk proses SetUID.

Contoh:

root@johan-HP-ProBook-6560b-LG654EA-ACQ:/proc# ls -l 2443/fd
total 0
lr-x------ 1 johan johan 64 Feb 27 10:26 0 -> pipe:[13637]
l-wx------ 1 johan johan 64 Feb 27 10:26 1 -> /home/johan/.xsession-errors
lrwx------ 1 johan johan 64 Feb 27 10:26 10 -> anon_inode:[eventfd]
lrwx------ 1 johan johan 64 Feb 27 10:26 11 -> anon_inode:[eventfd]
lrwx------ 1 johan johan 64 Feb 27 10:26 12 -> socket:[39495]
lrwx------ 1 johan johan 64 Feb 27 10:26 13 -> anon_inode:[eventfd]
lr-x------ 1 johan johan 64 Feb 27 10:26 14 -> anon_inode:inotify
lrwx------ 1 johan johan 64 Feb 27 10:26 15 -> anon_inode:[eventfd]
l-wx------ 1 johan johan 64 Feb 27 10:26 16 -> pipe:[37885]
lr-x------ 1 johan johan 64 Feb 27 10:26 17 -> pipe:[37886]
l-wx------ 1 johan johan 64 Feb 27 10:26 2 -> /home/johan/.xsession-errors
l-wx------ 1 johan johan 64 Feb 27 10:26 21 -> pipe:[167984]
lr-x------ 1 johan johan 64 Feb 27 10:26 22 -> pipe:[167985]
l-wx------ 1 johan johan 64 Feb 27 10:26 23 -> pipe:[170009]
lr-x------ 1 johan johan 64 Feb 27 10:26 24 -> pipe:[170010]
lrwx------ 1 johan johan 64 Feb 27 10:26 3 -> anon_inode:[eventfd]
lr-x------ 1 johan johan 64 Feb 27 10:26 4 -> pipe:[14726]
lrwx------ 1 johan johan 64 Feb 27 10:26 5 -> socket:[14721]
l-wx------ 1 johan johan 64 Feb 27 10:26 6 -> pipe:[14726]
lrwx------ 1 johan johan 64 Feb 27 10:26 7 -> socket:[14730]
lrwx------ 1 johan johan 64 Feb 27 10:26 8 -> socket:[13984]
lrwx------ 1 johan johan 64 Feb 27 10:26 9 -> socket:[14767]

root@johan-HP:/proc# cat 2443/fdinfo/2
pos:    1244446
flags:  0102001

Lihat juga seluruh file di bawah / proc ... banyak informasi berguna dari sistem berada di sini.

Johan
sumber